//Drzewo przedzialowe przedzial-punkt rekurencyjnie, dodanie na przedziale, zapytanie w punkcie //Zuzanna Ossowska #include <bits/stdc++.h> using namespace std; const int limit=1<<5; const int N=(1<<4); //potega dwojki-1, co najmniej tyle ile dlugosc ciagu short int tree[limit]; //2*(N+1) short int sprawdz(int w) { short int wynik=0; w+=N; while (w>0) { wynik|=tree[w]; w/=2; } return wynik; } ///wierzcholek, left, right, poc, kon, zmiana void zmien(int w, int p, int k, int x, int y, short int val) { if (k<x || p>y) return; if (x<=p && k<=y) { tree[w]|=val; return; } //cout<<w<<"\n"; zmien(w*2,p,(p+k)/2,x,y,val); zmien(w*2+1,(p+k)/2+1,k,x,y,val); } ///do tego miejsca kod przeklejony /// kod z obowu organizowanego przez ///stowarzyszenie talent 20pomorzanka09 ///oczywiscie troche go zmodyfikowalem ///autor kodu do drzewa jest na poczatku int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; cin>>n>>m; //zmien(1, 0, N, 1, 5, 4); // cout<<sprawdz(0)<<sprawdz(1)<<sprawdz(2)<<sprawdz(3)<<sprawdz(4)<<sprawdz(5)<<sprawdz(6)<<sprawdz(7)<<"\n"; for(int i=0; i<m; i++){ int a, b; cin>>a>>b; short int kolor; cin>>kolor; if(kolor==3)kolor=4; zmien(1, 0, N-1, a-1, b-1, kolor); } int wynik=0; for(int i=0; i<n; i++){ auto x=sprawdz(i); if(x==3){wynik++;} } cout<<wynik<<"\n"; }
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 | //Drzewo przedzialowe przedzial-punkt rekurencyjnie, dodanie na przedziale, zapytanie w punkcie //Zuzanna Ossowska #include <bits/stdc++.h> using namespace std; const int limit=1<<5; const int N=(1<<4); //potega dwojki-1, co najmniej tyle ile dlugosc ciagu short int tree[limit]; //2*(N+1) short int sprawdz(int w) { short int wynik=0; w+=N; while (w>0) { wynik|=tree[w]; w/=2; } return wynik; } ///wierzcholek, left, right, poc, kon, zmiana void zmien(int w, int p, int k, int x, int y, short int val) { if (k<x || p>y) return; if (x<=p && k<=y) { tree[w]|=val; return; } //cout<<w<<"\n"; zmien(w*2,p,(p+k)/2,x,y,val); zmien(w*2+1,(p+k)/2+1,k,x,y,val); } ///do tego miejsca kod przeklejony /// kod z obowu organizowanego przez ///stowarzyszenie talent 20pomorzanka09 ///oczywiscie troche go zmodyfikowalem ///autor kodu do drzewa jest na poczatku int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m; cin>>n>>m; //zmien(1, 0, N, 1, 5, 4); // cout<<sprawdz(0)<<sprawdz(1)<<sprawdz(2)<<sprawdz(3)<<sprawdz(4)<<sprawdz(5)<<sprawdz(6)<<sprawdz(7)<<"\n"; for(int i=0; i<m; i++){ int a, b; cin>>a>>b; short int kolor; cin>>kolor; if(kolor==3)kolor=4; zmien(1, 0, N-1, a-1, b-1, kolor); } int wynik=0; for(int i=0; i<n; i++){ auto x=sprawdz(i); if(x==3){wynik++;} } cout<<wynik<<"\n"; } |