#include<iostream> using namespace std; int n, m, pot; bool tree[2097153][3]; int zak[2097153][2]; void pt(){ int xx = 1; while( xx < n){ xx *= 2; } pot = xx; } void fun(int l, int p, int x, int k){ if(zak[x][0] == l && zak[x][1] == p) tree[x][k] = true; else{ if( l > zak[2*x][1]) fun(l, p, 2*x+1, k); else if( p < zak[2*x+1][0]) fun(l, p, 2*x, k); else{ fun(l, zak[2*x][1], 2*x, k); fun(zak[2*x+1][0], p, 2*x+1, k); } } } void zlicz0(int x){ if( tree[x][0] == true){ for(int i=zak[x][0]; i<=zak[x][1]; i++){ tree[i][0] = true; } } else if( 2*x+1 < 2*pot){ zlicz0(2*x); zlicz0(2*x+1); } } void zlicz1(int x){ if(tree[x][1] == true ){ for(int i=zak[x][0]; i<=zak[x][1]; i++){ tree[i][1] = true; } } else if( 2*x+1 < 2*pot){ zlicz1(2*x); zlicz1(2*x+1); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>> n >> m; pt(); for(int i=pot; i<2*pot; i++){ zak[i][0] = i; zak[i][1] = i; } for(int i=pot-1; i>0; i--){ zak[i][0] = zak[2*i][0]; zak[i][1] = zak[2*i+1][1]; } int l, p, k; for(int i=0; i<m; i++){ cin>> l >> p >> k; k--; l += pot-1; p += pot-1; fun(l, p, 1, k); } zlicz0(1); zlicz1(1); int sum = 0; for(int i=pot; i<pot+n; i++){ if( tree[i][0] == true && tree[i][1] == true && tree[i][2] == false) sum++; } cout<< sum; }
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 | #include<iostream> using namespace std; int n, m, pot; bool tree[2097153][3]; int zak[2097153][2]; void pt(){ int xx = 1; while( xx < n){ xx *= 2; } pot = xx; } void fun(int l, int p, int x, int k){ if(zak[x][0] == l && zak[x][1] == p) tree[x][k] = true; else{ if( l > zak[2*x][1]) fun(l, p, 2*x+1, k); else if( p < zak[2*x+1][0]) fun(l, p, 2*x, k); else{ fun(l, zak[2*x][1], 2*x, k); fun(zak[2*x+1][0], p, 2*x+1, k); } } } void zlicz0(int x){ if( tree[x][0] == true){ for(int i=zak[x][0]; i<=zak[x][1]; i++){ tree[i][0] = true; } } else if( 2*x+1 < 2*pot){ zlicz0(2*x); zlicz0(2*x+1); } } void zlicz1(int x){ if(tree[x][1] == true ){ for(int i=zak[x][0]; i<=zak[x][1]; i++){ tree[i][1] = true; } } else if( 2*x+1 < 2*pot){ zlicz1(2*x); zlicz1(2*x+1); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>> n >> m; pt(); for(int i=pot; i<2*pot; i++){ zak[i][0] = i; zak[i][1] = i; } for(int i=pot-1; i>0; i--){ zak[i][0] = zak[2*i][0]; zak[i][1] = zak[2*i+1][1]; } int l, p, k; for(int i=0; i<m; i++){ cin>> l >> p >> k; k--; l += pot-1; p += pot-1; fun(l, p, 1, k); } zlicz0(1); zlicz1(1); int sum = 0; for(int i=pot; i<pot+n; i++){ if( tree[i][0] == true && tree[i][1] == true && tree[i][2] == false) sum++; } cout<< sum; } |