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