#include <bits/stdc++.h> using namespace std; const int MAX=(1<<20); int n,m; int tree[2*MAX]; void Update(int a, int b, int v, int l, int p, int d) { if(b < a) return; if(a == l && b == p) { if(tree[v] == 0) tree[v] = d; if(tree[v] != d && tree[v] < 3) tree[v]+=d; if(d == 4) tree[v] = 4; return; } int m=(l+p)/2; Update(a, min(b,m), 2*v, l, m, d); Update(max(m+1, a), b, 2*v+1, m+1, p, d); return; } bool spr(int a) { int x=0,y=0; while(a != 0) { if(tree[a] == 4) return false; if(tree[a] == 1) x++; if(tree[a] == 2) y++; if(tree[a] == 3) { x++; y++; } a/=2; } if(x > 0 && y > 0) return true; return false; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i=0; i<m; i++) { int a,b,d; cin >> a >> b >> d; if(d == 3) d=4; Update(a,b,1,1,MAX,d); } int wynik=0; for(int i=MAX; i<=MAX+n; i++) if(spr(i)) wynik++; cout << wynik; }
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 | #include <bits/stdc++.h> using namespace std; const int MAX=(1<<20); int n,m; int tree[2*MAX]; void Update(int a, int b, int v, int l, int p, int d) { if(b < a) return; if(a == l && b == p) { if(tree[v] == 0) tree[v] = d; if(tree[v] != d && tree[v] < 3) tree[v]+=d; if(d == 4) tree[v] = 4; return; } int m=(l+p)/2; Update(a, min(b,m), 2*v, l, m, d); Update(max(m+1, a), b, 2*v+1, m+1, p, d); return; } bool spr(int a) { int x=0,y=0; while(a != 0) { if(tree[a] == 4) return false; if(tree[a] == 1) x++; if(tree[a] == 2) y++; if(tree[a] == 3) { x++; y++; } a/=2; } if(x > 0 && y > 0) return true; return false; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i=0; i<m; i++) { int a,b,d; cin >> a >> b >> d; if(d == 3) d=4; Update(a,b,1,1,MAX,d); } int wynik=0; for(int i=MAX; i<=MAX+n; i++) if(spr(i)) wynik++; cout << wynik; } |