#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);
}
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); } |
English