Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<climits>
- using namespace std;
- struct s{
- int l;
- int r; int max; int lv; int rv; int mv;
- }tree[500005];
- int a[100005];
- void build_tree(int n, int l,int r){
- if(l<0||r>100000) return ;
- if(l==r){
- tree[n].r=tree[n].max=tree[n].l=1; tree[n].rv=tree[n].mv=tree[n].lv=a[l]; return ;
- }
- int mid=(l+r)>>1;
- build_tree(2*n+1,l,mid);
- build_tree(2*n+2,mid+1,r);
- 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){
- tree[n].r=tree[n].max=tree[n].l=r-l+1; tree[n].rv=tree[n].mv=tree[n].lv=a[l];
- }
- else if(tree[2*n+1].rv==tree[2*n+2].lv&&tree[2*n+1].lv==tree[2*n+1].rv){
- tree[n].r=tree[2*n+2].r;
- tree[n].max=tree[n].l=tree[2*n+1].max+tree[2*n+2].l;
- tree[n].rv=tree[2*n+2].rv;
- tree[n].mv=tree[n].lv=tree[2*n+1].lv;
- }
- else if(tree[2*n+1].rv==tree[2*n+2].lv&&tree[2*n+2].lv==tree[2*n+2].rv){
- tree[n].l=tree[2*n+1].l;
- tree[n].max=tree[n].r=tree[2*n+2].max+tree[2*n+1].r;
- tree[n].mv=tree[n].rv=tree[2*n+2].rv;
- tree[n].lv=tree[2*n+1].lv;
- }
- else if(tree[2*n+1].rv==tree[2*n+2].lv){
- tree[n].l=tree[2*n+1].l;
- tree[n].r=tree[2*n+2].r;
- 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);
- tree[n].rv=tree[2*n+2].rv;
- tree[n].lv=tree[2*n+1].lv;
- if(tree[n].max==tree[2*n+1].max)
- tree[n].mv=tree[2*n+1].mv;
- else if(tree[n].max==tree[2*n+2].max)
- tree[n].mv=tree[2*n+2].mv;
- else tree[n].mv=tree[2*n+1].rv;
- }
- else{
- tree[n].l=tree[2*n+1].l;
- tree[n].r=tree[2*n+2].r;
- tree[n].max=max(tree[2*n+1].max,tree[2*n+2].max);
- tree[n].rv=tree[2*n+2].rv;
- tree[n].lv=tree[2*n+1].lv;
- if(tree[n].max==tree[2*n+1].max)
- tree[n].mv=tree[2*n+1].mv;
- else
- tree[n].mv=tree[2*n+2].mv;
- }
- }
- s query(int n,int i,int j,int l,int r){ s p,q1,q2;
- p.l=p.r=p.max=p.lv=p.rv=p.mv=0;
- if(i>j||l>j||r<i) return p;
- else if(i>=l&&j<=r)
- return tree[n];
- int mid=(i+j)>>1;
- q1=query(2*n+1,i,mid,l,r); q2=query(2*n+2,mid+1,j,l,r);
- if(q1.rv==q2.lv){
- p.max=max(max(q1.max,q2.max),q1.r+q2.l);
- p.l=q1.l; p.r=q2.r;
- p.lv=q1.lv; p.rv=q2.rv;
- if(p.max==q1.max) p.mv=q1.mv;
- else if(p.max==q2.max) p.mv=q2.mv;
- else p.mv=q1.rv;
- }
- else{
- p.max=max(q1.max,q2.max);
- p.l=q1.l; p.r=q2.r;
- p.lv=q1.lv; p.rv=q2.rv;
- if(p.max==q1.max) p.mv=q1.mv;
- else p.mv=q2.mv;
- }
- return p;
- }
- int main() {
- int n,q; cin>>n;
- while(n!=0){cin>>q;
- for(int i=0;i<n;i++) cin>>a[i];
- build_tree(0,0,n-1);
- for(int i=0;i<q;i++){
- int l,r; cin>>l>>r; l--; r--;
- s x=query(0,0,n-1,l,r);
- cout<<x.max<<endl;
- }
- cin>>n;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment