Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int const zak=128*1024;
- int d, n, dl, x, y, czas;
- pair<int, int> drzewo[2*zak];
- int sufi(int a){
- int b;
- while(a>1){
- a/=2;
- b++;
- }
- b=pow(2, b);
- if(b!=a)
- b*=2;
- return b;
- }
- //sprowadz do ile na przedziale od (dl)+a do (dl)+b (sprawdz, czy zgadza sie p, q, a, b (wielkosci wzgledem dl))
- void in(int gdzie, int p, int q, int a, int b, int ile){
- if(a<=p && b>=q){
- drzewo[gdzie]=make_pair(ile, czas);
- czas++;
- return;
- }
- int sr=(p+q)/2;
- if(a<=sr)
- in(gdzie*2, p, sr, a, b, ile);
- if(b>sr)
- in(gdzie*2+1, sr+1, q, a, b, ile);
- drzewo[gdzie]=max(drzewo[2*gdzie], drzewo[2*gdzie+1]);
- return;
- }
- int akt(int v){
- pair<int, int> naj=drzewo[v];
- while(v>1){
- v/=2;
- if(drzewo[v].second>naj.second)
- naj=drzewo[v];
- }
- return naj.first;
- }
- //podaj max. wartosc od a do b (sprawdz, czy zgadza sie p, q, a, b (wielkosci wzgledem dl))
- int que(int gdzie, int p, int q, int a, int b){
- int ans=0;
- if(a<=p && b>=q)
- return max(ans, akt(gdzie));
- int sr=(p+q)/2;
- if(a<=sr)
- return max(ans, que(gdzie*2, p, sr, a, b));
- if(b>sr)
- return max(ans, que(gdzie*2+1, sr+1, q, a, b));
- printf("assert");
- return;
- }
- int main(){
- scanf("%d%d", &d, &n);
- dl=sufi(n);
- for(int i=1; i<n+1; i++){
- scanf("%d%d", &x, &y);
- y=x+y;
- in(1, 1, dl, x, y, que(1, 1, dl, x, y)+1);
- }
- printf("%d", que(1, 1, dl, 1, dl));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement