1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <bits/stdc++.h>
using namespace std;

const int siz = 1048576;

struct N {
  int b;
  int z;
  int n;
  int x;
  bool u0;
  bool u1;
  bool u2;
  bool u3;
};

void add(N& a, int v) {
  switch(v) {
    case 0:
      a.u0 = true;
      a.b++;
      break;
    case 1:
      a.u1 = true;
      a.z += a.b;
      a.x += a.n;
      a.b = 0;
      a.n = 0;
      break;
    case 2:
      a.u2 = true;
      a.n += a.b;
      a.x += a.z;
      a.b = 0;
      a.z = 0;
      break;
    case 3:
      a.u3 = true;
      a.b = 0;
      a.z = 0;
      a.n = 0;
      a.x = 0;
      break;
  }
}

N t[siz*2];

void push(int x) {
  if(t[x].u0) add(t[x*2], 0), add(t[x*2+1], 0), t[x].u0 = false;
  if(t[x].u1) add(t[x*2], 1), add(t[x*2+1], 1), t[x].u1 = false;
  if(t[x].u2) add(t[x*2], 2), add(t[x*2+1], 2), t[x].u2 = false;
  if(t[x].u3) add(t[x*2], 3), add(t[x*2+1], 3), t[x].u3 = false;
  t[x].b = t[x*2].b + t[x*2+1].b;
  t[x].z = t[x*2].z + t[x*2+1].z;
  t[x].n = t[x*2].n + t[x*2+1].n;
  t[x].x = t[x*2].x + t[x*2+1].x;
}

void add(int a, int b, int v, int x = 1, int p = 0, int q = siz-1) {
  if(a > q || b < p) return;
  if(a <= p && b >= q) {
    add(t[x], v);
    return;
  }
  push(x);
  add(a, b, v, x*2, p, (p+q)/2);
  add(a, b, v, x*2+1, (p+q)/2+1, q);
  t[x].b = t[x*2].b + t[x*2+1].b;
  t[x].z = t[x*2].z + t[x*2+1].z;
  t[x].n = t[x*2].n + t[x*2+1].n;
  t[x].x = t[x*2].x + t[x*2+1].x;
}

int main() {

  int n, m, l, r, k;
  scanf("%d %d", &n, &m);

  add(0, siz-1, 0);

  for(int i = 0; i < m; i++) {
    scanf("%d %d %d", &l, &r, &k);
    add(l-1, r-1, k);
  }

  printf("%d", t[1].x);

}