WA只过了样例求助

P2839 [国家集训队] middle

qwq___qaq @ 2023-09-12 21:42:29

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e4+5;
int n,q,c[4],root[N],tot,lst;
pair<int,int> p[N];
struct node{
    int ls,rs,lmax,rmax,sum;
}t[N<<5];
inline void pushup(int p){
    int ls=t[p].ls,rs=t[p].rs;
    t[p].lmax=max(t[ls].lmax,t[ls].sum+t[rs].lmax);
    t[p].rmax=max(t[rs].rmax,t[rs].sum+t[ls].rmax);
    t[p].sum=t[ls].sum+t[rs].sum;
}
inline int clone(int p){
    t[++tot]=t[p];
    return tot;
}
int update(int p,int l,int r,int x,int v){
    p=clone(p);
    if(l==r){
        t[p].lmax=t[p].rmax=max(v,0ll);
        t[p].sum=v;
        return p;
    }
    int mid=l+r>>1;
    if(x<=mid)
        t[p].ls=update(t[p].ls,l,mid,x,v);
    else
        t[p].rs=update(t[p].rs,mid+1,r,x,v);
    pushup(p);
    return p;
}
node query(int p,int l,int r,int x,int y){
    if(x>y) return node({-1,-1,0,0,0});
    if(x<=l&&r<=y) return t[p];
    int mid=l+r>>1;
    if(y<=mid) return query(t[p].ls,l,mid,x,y);
    if(mid<x) return query(t[p].rs,mid+1,r,x,y);
    node L=query(t[p].ls,l,mid,x,y),R=query(t[p].rs,mid+1,r,x,y);
    return node({-1,-1,max(L.lmax,L.sum+R.ls),max(R.rmax,R.sum+L.rmax),L.sum+R.sum});
}
int build(int p,int l,int r){
    p=++tot;
    if(l==r){
        t[p].sum=t[p].lmax=t[p].rmax=1;
        return p;
    }
    int mid=l+r>>1;
    t[p].ls=build(t[p].ls,l,mid);
    t[p].rs=build(t[p].rs,mid+1,r);
    pushup(p);
    return p;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;++i)
        cin>>p[i].first,p[i].second=i;
    sort(p+1,p+n+1);
    root[0]=build(1,1,n);
    for(int i=1;i<=n;++i)
        root[i]=update(root[i-1],1,n,p[i].second,-1);
    cin>>q;
    while(q--){
        for(int i=0;i<4;++i){
            cin>>c[i];
            c[i]=(c[i]+lst)%n+1;
        }
        sort(c,c+4);
        int l=1,r=n,ans;
        while(l<=r){
            int mid=l+r>>1;
            if(query(root[mid-1],1,n,c[1],c[2]).sum+query(root[mid-1],1,n,c[0],c[1]-1).rmax+query(root[mid-1],1,n,c[2]+1,c[3]).lmax>=0)
                ans=l,l=mid+1;
            else
                r=mid-1;
        }
        cout<<(lst=p[ans].first)<<endl;
    }
    return 0;
}

|