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