#include <iostream> #include <fstream> using namespace std; #define rozm 1048576 #define rozm2 2097152 //const int rozm = 1<<20; //const int rozm2 = 2*rozm; struct dk{ ///numeracja od 0 int dp[rozm2]; dk(){ for(int i=0; i<rozm2; i++) dp[i]=0; } int wartosc(int i){ i |= rozm; int zwrot=0; while (i){ zwrot+=dp[i]; i>>=1; } return zwrot; } void dodaj(int i){ i |= rozm; while(i>0){ if(i & 1); else {i++; dp[i]--;} i>>=1; } dp[1]++; } void ujmij(int i){ i |= rozm; while(i>0){ if(i & 1); else {i++; dp[i]++;} i>>=1; } dp[1]--; } void zwiekszprzedzial(int a, int b){ //cout << a << " " << b << endl; dodaj(b); if(a>0) ujmij(a-1); } void ogarnij(int i){ if(i<rozm){ dp[i<<1]+=dp[i]; ogarnij(i<<1); dp[(i<<1)+1]+=dp[i]; ogarnij((i<<1)+1); dp[i]=0; } } }; dk kol1, kol2, kol3; int n, m, l, r, k; int main() { scanf("%d %d", &n, &m); for(int i=0; i<m; i++){ scanf("%d %d %d", &l, &r, &k); l--; r--; if(k==1) kol1.zwiekszprzedzial(l, r); else if(k==2) kol2.zwiekszprzedzial(l, r); else if(k==3) kol3.zwiekszprzedzial(l, r); //for(int i=0; i<n; i++) //cout << "T: " << kol1.wartosc(i) << " " << kol2.wartosc(i) << " " << kol3.wartosc(i) << endl; } kol1.ogarnij(1); kol2.ogarnij(1); kol3.ogarnij(1); int wynik=0; for(int i=rozm; i<rozm+n; i++) //cout << "T: " << kol1.dp[i] << " " << kol2.dp[i] << " " << kol3.dp[i] << endl; if(kol1.dp[i]>0 && kol2.dp[i] >0 && kol3.dp[i]==0) wynik++; printf("%d", wynik); return 0; for(int i=0; i<10; i++) kol1.zwiekszprzedzial(2*i, 2*i+1); for(int i=0; i<20; i++) cout << kol1.wartosc(i) << " "; cout << endl; kol1.ogarnij(1); for(int i=rozm; i<rozm+20; i++) cout << kol1.dp[i] << " "; return 0; }
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 90 91 92 93 94 | #include <iostream> #include <fstream> using namespace std; #define rozm 1048576 #define rozm2 2097152 //const int rozm = 1<<20; //const int rozm2 = 2*rozm; struct dk{ ///numeracja od 0 int dp[rozm2]; dk(){ for(int i=0; i<rozm2; i++) dp[i]=0; } int wartosc(int i){ i |= rozm; int zwrot=0; while (i){ zwrot+=dp[i]; i>>=1; } return zwrot; } void dodaj(int i){ i |= rozm; while(i>0){ if(i & 1); else {i++; dp[i]--;} i>>=1; } dp[1]++; } void ujmij(int i){ i |= rozm; while(i>0){ if(i & 1); else {i++; dp[i]++;} i>>=1; } dp[1]--; } void zwiekszprzedzial(int a, int b){ //cout << a << " " << b << endl; dodaj(b); if(a>0) ujmij(a-1); } void ogarnij(int i){ if(i<rozm){ dp[i<<1]+=dp[i]; ogarnij(i<<1); dp[(i<<1)+1]+=dp[i]; ogarnij((i<<1)+1); dp[i]=0; } } }; dk kol1, kol2, kol3; int n, m, l, r, k; int main() { scanf("%d %d", &n, &m); for(int i=0; i<m; i++){ scanf("%d %d %d", &l, &r, &k); l--; r--; if(k==1) kol1.zwiekszprzedzial(l, r); else if(k==2) kol2.zwiekszprzedzial(l, r); else if(k==3) kol3.zwiekszprzedzial(l, r); //for(int i=0; i<n; i++) //cout << "T: " << kol1.wartosc(i) << " " << kol2.wartosc(i) << " " << kol3.wartosc(i) << endl; } kol1.ogarnij(1); kol2.ogarnij(1); kol3.ogarnij(1); int wynik=0; for(int i=rozm; i<rozm+n; i++) //cout << "T: " << kol1.dp[i] << " " << kol2.dp[i] << " " << kol3.dp[i] << endl; if(kol1.dp[i]>0 && kol2.dp[i] >0 && kol3.dp[i]==0) wynik++; printf("%d", wynik); return 0; for(int i=0; i<10; i++) kol1.zwiekszprzedzial(2*i, 2*i+1); for(int i=0; i<20; i++) cout << kol1.wartosc(i) << " "; cout << endl; kol1.ogarnij(1); for(int i=rozm; i<rozm+20; i++) cout << kol1.dp[i] << " "; return 0; } |