Guest User

frequent values

a guest
Apr 17th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.91 KB | None | 0 0
  1. #include <iostream>
  2. #include<climits>
  3. using namespace std;
  4. struct s{
  5.     int l;
  6.     int r; int max; int lv; int rv; int mv;
  7. }tree[500005];
  8. int a[100005];
  9. void build_tree(int n, int l,int r){
  10.     if(l<0||r>100000) return ;
  11.     if(l==r){
  12.         tree[n].r=tree[n].max=tree[n].l=1; tree[n].rv=tree[n].mv=tree[n].lv=a[l]; return ;
  13.     }
  14.     int mid=(l+r)>>1;
  15.      build_tree(2*n+1,l,mid);
  16.      build_tree(2*n+2,mid+1,r);
  17.      if(tree[2*n+1].rv==tree[2*n+2].lv&&tree[2*n+1].lv==tree[2*n+2].rv&&tree[2*n+1].lv==tree[2*n+1].rv){
  18.          tree[n].r=tree[n].max=tree[n].l=r-l+1; tree[n].rv=tree[n].mv=tree[n].lv=a[l];
  19.     }
  20.     else if(tree[2*n+1].rv==tree[2*n+2].lv&&tree[2*n+1].lv==tree[2*n+1].rv){
  21.          tree[n].r=tree[2*n+2].r;
  22.          tree[n].max=tree[n].l=tree[2*n+1].max+tree[2*n+2].l;
  23.          tree[n].rv=tree[2*n+2].rv;
  24.          tree[n].mv=tree[n].lv=tree[2*n+1].lv;
  25.     }
  26.     else if(tree[2*n+1].rv==tree[2*n+2].lv&&tree[2*n+2].lv==tree[2*n+2].rv){
  27.         tree[n].l=tree[2*n+1].l;
  28.          tree[n].max=tree[n].r=tree[2*n+2].max+tree[2*n+1].r;
  29.          tree[n].mv=tree[n].rv=tree[2*n+2].rv;
  30.         tree[n].lv=tree[2*n+1].lv;
  31.     }
  32.      else if(tree[2*n+1].rv==tree[2*n+2].lv){
  33.         tree[n].l=tree[2*n+1].l;
  34.         tree[n].r=tree[2*n+2].r;
  35.         tree[n].max=max(max(tree[2*n+1].max,tree[2*n+2].max),tree[2*n+2].l+tree[2*n+1].r);
  36.         tree[n].rv=tree[2*n+2].rv;
  37.         tree[n].lv=tree[2*n+1].lv;
  38.         if(tree[n].max==tree[2*n+1].max)
  39.         tree[n].mv=tree[2*n+1].mv;
  40.         else if(tree[n].max==tree[2*n+2].max)
  41.         tree[n].mv=tree[2*n+2].mv;
  42.         else tree[n].mv=tree[2*n+1].rv;
  43.     }
  44.     else{
  45.          tree[n].l=tree[2*n+1].l;
  46.         tree[n].r=tree[2*n+2].r;
  47.         tree[n].max=max(tree[2*n+1].max,tree[2*n+2].max);
  48.          tree[n].rv=tree[2*n+2].rv;
  49.         tree[n].lv=tree[2*n+1].lv;
  50.         if(tree[n].max==tree[2*n+1].max)
  51.         tree[n].mv=tree[2*n+1].mv;
  52.         else
  53.         tree[n].mv=tree[2*n+2].mv;
  54.  
  55.     }
  56. }
  57. s query(int n,int i,int j,int l,int r){ s p,q1,q2;
  58. p.l=p.r=p.max=p.lv=p.rv=p.mv=0;
  59.     if(i>j||l>j||r<i) return p;
  60.     else if(i>=l&&j<=r)
  61.     return tree[n];
  62.     int mid=(i+j)>>1;
  63.     q1=query(2*n+1,i,mid,l,r); q2=query(2*n+2,mid+1,j,l,r);
  64.     if(q1.rv==q2.lv){
  65.         p.max=max(max(q1.max,q2.max),q1.r+q2.l);
  66.         p.l=q1.l; p.r=q2.r;
  67.         p.lv=q1.lv; p.rv=q2.rv;
  68.         if(p.max==q1.max) p.mv=q1.mv;
  69.         else if(p.max==q2.max) p.mv=q2.mv;
  70.         else p.mv=q1.rv;
  71.     }
  72.     else{
  73.         p.max=max(q1.max,q2.max);
  74.         p.l=q1.l; p.r=q2.r;
  75.         p.lv=q1.lv; p.rv=q2.rv;
  76.         if(p.max==q1.max) p.mv=q1.mv;
  77.         else p.mv=q2.mv;
  78.     }
  79.     return p;
  80. }
  81.  
  82. int main() {
  83. int n,q; cin>>n;
  84. while(n!=0){cin>>q;
  85.  
  86.   for(int i=0;i<n;i++) cin>>a[i];
  87.   build_tree(0,0,n-1);
  88.   for(int i=0;i<q;i++){
  89.       int l,r; cin>>l>>r; l--; r--;
  90.       s x=query(0,0,n-1,l,r);
  91.       cout<<x.max<<endl;
  92.   }
  93.     cin>>n;
  94. }
  95. return 0;
  96. }
Add Comment
Please, Sign In to add comment