yicongli

T162T3

Mar 28th, 2019
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c))x=x*10+c-'0',gc;x*=k;
  14. }
  15.  
  16. const int N=5e5+7;
  17. const int S=710;
  18.  
  19. int a[N];
  20. int be[N];
  21. int val[N];
  22. int Ans[N];
  23. int L[S];
  24. int R[S];
  25. int lst[N];
  26. int pre[N];
  27. int nex[N];
  28. int sum[N];
  29. int ID[N];
  30. int LG[N];
  31. int st[N][20];
  32.  
  33. struct Query{
  34.     int l,r,id;
  35.     inline bool operator < (const Query &a)const{
  36.         return be[l]==be[a.l]?r<a.r:l<a.l;
  37.     }
  38. }Q[N];
  39.  
  40. int n,q,tot;
  41. int ans;
  42.  
  43. inline int solve(int l,int r){
  44.     int ret=0;
  45.     for(int i=l;i<=r;++i){
  46.         if(pre[i]>=l){
  47.             sum[ID[i]]+=i-pre[i];
  48.             ret=max(ret,sum[ID[i]]);
  49.         }
  50.     }
  51.     for(int i=l;i<=r;++i)sum[ID[i]]=0;
  52.     return ret+1;
  53. }
  54.  
  55. inline void Get(int x,int &i){
  56.     int l=R[x]+1,r=R[x];
  57.     memset(sum+1,0,tot<<2);
  58.     for(ans=0;be[Q[i].l]==x;++i){
  59.         if(be[Q[i].r]==x)continue;
  60.         while(r<Q[i].r){
  61.             r++;
  62.             if(pre[r]>R[x]){
  63.                 sum[ID[r]]+=r-pre[r];
  64.                 ans=max(ans,sum[ID[r]]);
  65.             }
  66.         }
  67.         ll t=ans;
  68.         while(l>Q[i].l){
  69.             l--;
  70.             if(nex[l]<=r){
  71.                 sum[ID[l]]+=nex[l]-l;
  72.                 ans=max(ans,sum[ID[l]]);
  73.             }
  74.         }
  75.         Ans[Q[i].id]=ans+1;
  76.         while(l<R[x]+1){
  77.             if(nex[l]<=r){
  78.                 sum[ID[l]]-=nex[l]-l;
  79.             }
  80.             l++;
  81.         }
  82.         ans=t;
  83.     }
  84. }
  85.  
  86. inline int query(int l,int r){
  87.     int x=LG[r-l+1];
  88.     return max(st[l][x],st[r-(1<<x)+1][x]);
  89. }
  90.  
  91. int main(){
  92.     freopen("spiral.in","r",stdin);
  93.     freopen("spiral.out","w",stdout);
  94.     r(n),r(q);
  95.     const int SIZE=sqrt(n);
  96.     for(int i=1;i<=n;++i){
  97.         r(a[i]);
  98.         be[i]=(i-1)/SIZE+1;
  99.         if(!L[be[i]])L[be[i]]=i;
  100.         R[be[i]]=i;
  101.         val[i]=a[i];
  102.     }
  103.     sort(val+1,val+n+1);
  104.     for(int i=1;i<=n;++i){
  105.         a[i]=lower_bound(val+1,val+n+1,a[i])-val;
  106.     }
  107.     for(int i=2;i<=n;++i)LG[i]=LG[i>>1]+1;
  108.     for(int i=1;i<=n;++i)st[i][0]=a[i];
  109.     for(int j=1;j<=LG[n];++j){
  110.         for(int i=1;i+(1<<j)-1<=n;++i){
  111.             st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
  112.         }
  113.     }
  114.     for(int i=1;i<=n;++i){
  115.         pre[i]=0;
  116.         nex[i]=n+1;
  117.         if(lst[a[i]]&&query(lst[a[i]],i)==a[i]){
  118.             pre[i]=lst[a[i]];
  119.             nex[pre[i]]=i;
  120.         }
  121.         lst[a[i]]=i;
  122.     }
  123.     for(int i=1;i<=n;++i){
  124.         if(!pre[i])ID[i]=++tot;
  125.         else ID[i]=ID[pre[i]];
  126.     }
  127.     for(int i=1;i<=q;++i){
  128.         r(Q[i].l),r(Q[i].r);
  129.         if(be[Q[i].l]==be[Q[i].r]){
  130.             Ans[i]=solve(Q[i].l,Q[i].r);
  131.         }
  132.         else Q[i].id=i;
  133.     }
  134.     sort(Q+1,Q+q+1);
  135.     for(int i=1,x=1;i<=q;++x){
  136.         Get(x,i);
  137.     }
  138.     for(int i=1;i<=q;++i){
  139.         printf("%d\n",Ans[i]);
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment