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