Advertisement
yicongli

BZ4241

Mar 28th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 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=1e5+7;
  17. const int S=320;
  18.  
  19. int a[N];
  20. int be[N];
  21. int val[N];
  22. int cnt[N];
  23. ll Ans[N];
  24. int L[S];
  25. int R[S];
  26.  
  27. struct Query{
  28.     int l,r,id;
  29.     inline bool operator < (const Query &a)const{
  30.         return be[l]==be[a.l]?r<a.r:l<a.l;
  31.     }
  32. }Q[N];
  33.  
  34. int n,q;
  35. ll ans;
  36.  
  37. inline void add(int x){
  38.     cnt[x]++;
  39.     ans=max(ans,(ll)cnt[x]*val[x]);
  40. }
  41.  
  42. inline void del(int x){
  43.     cnt[x]--;
  44. }
  45.  
  46. int tmp[N];
  47.  
  48. inline ll solve(int l,int r){
  49.     ll ret=0;
  50.     for(int i=l;i<=r;++i)tmp[a[i]]=0;
  51.     for(int i=l;i<=r;++i)tmp[a[i]]++;
  52.     for(int i=l;i<=r;++i)ret=max(ret,(ll)tmp[a[i]]*val[a[i]]);
  53.     return ret;
  54. }
  55.  
  56. inline void Get(int x,int &i){
  57.     int l=R[x]+1,r=R[x];
  58.     memset(cnt+1,0,n<<2);
  59.     for(ans=0;be[Q[i].l]==x;++i){
  60.         if(be[Q[i].r]==x){
  61.             Ans[Q[i].id]=solve(Q[i].l,Q[i].r);
  62.             continue;
  63.         }
  64.         while(r<Q[i].r)add(a[++r]);
  65.         ll t=ans;
  66.         while(l>Q[i].l)add(a[--l]);
  67.         Ans[Q[i].id]=ans;
  68.         while(l<R[x]+1)del(a[l++]);
  69.         ans=t;
  70.     }
  71. }
  72.  
  73. int main(){
  74.     r(n),r(q);
  75.     const int SIZE=sqrt(n);
  76.     for(int i=1;i<=n;++i){
  77.         r(a[i]);
  78.         be[i]=(i-1)/SIZE+1;
  79.         if(!L[be[i]])L[be[i]]=i;
  80.         R[be[i]]=i;
  81.         val[i]=a[i];
  82.     }
  83.     sort(val+1,val+n+1);
  84.     for(int i=1;i<=n;++i){
  85.         a[i]=lower_bound(val+1,val+n+1,a[i])-val;
  86.     }
  87.     for(int i=1;i<=q;++i){
  88.         r(Q[i].l),r(Q[i].r);
  89.         Q[i].id=i;
  90.     }
  91.     sort(Q+1,Q+q+1);
  92.     for(int i=1,x=1;i<=q;++x){
  93.         Get(x,i);
  94.     }
  95.     for(int i=1;i<=q;++i){
  96.         printf("%lld\n",Ans[i]);
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement