#include <bits/stdc++.h> using namespace std; vector <int> t; vector <pair<int,int> > trozm; void addele(int v,int c){ if ((t[v]&(1<<c))==0){ t[v]+=(1<<c); } } bool czyzaw(pair<int,int> x, int a, int b){ //cout << x.first<<" "<<x.second<<" "<<a<<" "<<b<<endl; if (a<=x.first && b>=x.second){ return true; } return false; } void dodaj (int v,int a,int b,int c){ //cout <<"->"<< v<<" "<<trozm[v].first<<" "<<trozm[v].second<<" "<<a<<" "<<b<<" "<<endl; if (czyzaw(trozm[1],a,b)){ addele(1,c); }else{ if (czyzaw(trozm[2*v],a,b)){ addele(2*v,c); //cout << "czek1 "<<2*v<<endl; } if (czyzaw(trozm[2*v+1],a,b)){ addele(2*v+1,c); //cout << "czek2 "<<2*v+1<<endl; } if (!czyzaw(trozm[2*v],a,b) && (czyzaw({a,a},trozm[2*v].first,trozm[2*v].second) || czyzaw({b,b},trozm[2*v].first,trozm[2*v].second))){ //cout << "czek3 "<<2*v<<endl; dodaj(2*v, a, b,c); } if (!czyzaw(trozm[2*v+1],a,b) && (czyzaw({a,a},trozm[2*v+1].first,trozm[2*v+1].second) || czyzaw({b,b},trozm[2*v+1].first,trozm[2*v+1].second))){ //cout << "czek4 "<<2*v+1<<endl; dodaj(2*v+1, a, b,c); } } } bool zapytaj (int i){ int tmp=t[i]; while (i>0){ i/=2; tmp=tmp | t[i]; } return tmp==3; } int main(){ ios_base::sync_with_stdio(0); int n2=1; int n,q; cin >> n >> q; while(n2<n){ n2*=2; } n2*=2; t.resize(n2); trozm.resize(n2); for (int i=n2/2;i<n2;i++){ trozm[i].first=i; trozm[i].second=i; } for (int i=n2/2-1;i>=0;i--){ trozm[i].first=min(trozm[2*i].first,trozm[2*i+1].first); trozm[i].second=max(trozm[2*i].second,trozm[2*i+1].second); //cout << i<<" "<<trozm[i].first<<" "<<trozm[i].second<<endl; } for (int q2=0; q2<q;q2++){ int tmp, tmp2, tmp3; cin >> tmp>>tmp2>>tmp3; tmp--; tmp2--; tmp3--; dodaj(1,tmp+n2/2,tmp2+n2/2,tmp3); /*for (int i=0;i<n2;i++){ cout << t[i]<<" "; } cout << endl;*/ } int wynik=0; for (int i=0; i<n;i++){ wynik+=zapytaj(i+n2/2); //cout << i << "<->"<<zapytaj(i+n2/2)<<endl; } cout << wynik<<endl; }
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 | #include <bits/stdc++.h> using namespace std; vector <int> t; vector <pair<int,int> > trozm; void addele(int v,int c){ if ((t[v]&(1<<c))==0){ t[v]+=(1<<c); } } bool czyzaw(pair<int,int> x, int a, int b){ //cout << x.first<<" "<<x.second<<" "<<a<<" "<<b<<endl; if (a<=x.first && b>=x.second){ return true; } return false; } void dodaj (int v,int a,int b,int c){ //cout <<"->"<< v<<" "<<trozm[v].first<<" "<<trozm[v].second<<" "<<a<<" "<<b<<" "<<endl; if (czyzaw(trozm[1],a,b)){ addele(1,c); }else{ if (czyzaw(trozm[2*v],a,b)){ addele(2*v,c); //cout << "czek1 "<<2*v<<endl; } if (czyzaw(trozm[2*v+1],a,b)){ addele(2*v+1,c); //cout << "czek2 "<<2*v+1<<endl; } if (!czyzaw(trozm[2*v],a,b) && (czyzaw({a,a},trozm[2*v].first,trozm[2*v].second) || czyzaw({b,b},trozm[2*v].first,trozm[2*v].second))){ //cout << "czek3 "<<2*v<<endl; dodaj(2*v, a, b,c); } if (!czyzaw(trozm[2*v+1],a,b) && (czyzaw({a,a},trozm[2*v+1].first,trozm[2*v+1].second) || czyzaw({b,b},trozm[2*v+1].first,trozm[2*v+1].second))){ //cout << "czek4 "<<2*v+1<<endl; dodaj(2*v+1, a, b,c); } } } bool zapytaj (int i){ int tmp=t[i]; while (i>0){ i/=2; tmp=tmp | t[i]; } return tmp==3; } int main(){ ios_base::sync_with_stdio(0); int n2=1; int n,q; cin >> n >> q; while(n2<n){ n2*=2; } n2*=2; t.resize(n2); trozm.resize(n2); for (int i=n2/2;i<n2;i++){ trozm[i].first=i; trozm[i].second=i; } for (int i=n2/2-1;i>=0;i--){ trozm[i].first=min(trozm[2*i].first,trozm[2*i+1].first); trozm[i].second=max(trozm[2*i].second,trozm[2*i+1].second); //cout << i<<" "<<trozm[i].first<<" "<<trozm[i].second<<endl; } for (int q2=0; q2<q;q2++){ int tmp, tmp2, tmp3; cin >> tmp>>tmp2>>tmp3; tmp--; tmp2--; tmp3--; dodaj(1,tmp+n2/2,tmp2+n2/2,tmp3); /*for (int i=0;i<n2;i++){ cout << t[i]<<" "; } cout << endl;*/ } int wynik=0; for (int i=0; i<n;i++){ wynik+=zapytaj(i+n2/2); //cout << i << "<->"<<zapytaj(i+n2/2)<<endl; } cout << wynik<<endl; } |