主席树经典问题 cxlove讲得很详细了 http://blog.csdn.net/acm_cxlove/article/details/8566093
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define pii pair<int,int>
#define mp make_pair
#define maxm 2560005
#define maxn 30000
#define getmid int mid=(l+r)>>1
#define ft first
#define sd second
int a[maxn],ls[maxm],rs[maxm],siz,root[maxn],sum[maxn];
int lx[maxm],rx[maxm];
pii h[maxn];
int n,m;
void pushup(int x)
{
sum[x]=sum[ls[x]]+sum[rs[x]];
lx[x]=max(lx[ls[x]],sum[ls[x]]+lx[rs[x]]);
rx[x]=max(rx[rs[x]],sum[rs[x]]+rx[ls[x]]);
}
int build(int l,int r)
{
siz++;
int k=siz;
if(l==r)
{
sum[k]=lx[k]=rx[k]=1;
return k;
}
int mid=(l+r)>>1;
ls[k]=build(l,mid);
rs[k]=build(mid+1,r);
pushup(k);
return k;
}
void update(int rt,int &x,int l,int r,int pos)
{
if(x==0)
{
siz++;
x=siz;
ls[x]=ls[rt];
rs[x]=rs[rt];
}
if(l==r)
{
lx[x]=rx[x]=sum[x]=-1;
return;
}
getmid;
if(pos<=mid)
{
ls[x]=0;update(ls[rt],ls[x],l,mid,pos);
}
else
{
rs[x]=0;update(rs[rt],rs[x],mid+1,r,pos);
}
pushup(x);
}
int qsum(int rt,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return sum[rt];
}
getmid;
int ans=0;
if(x<=mid) ans+=qsum(ls[rt],l,mid,x,y);
if(y>mid) ans+=qsum(rs[rt],mid+1,r,x,y);
return ans;
}
int qlx(int rt,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return lx[rt];
int mid=(l+r)>>1;
if(y<=mid) return qlx(ls[rt],l,mid,x,y);
else if(x>mid) return qlx(rs[rt],mid+1,r,x,y);
else
{
int v1=qlx(ls[rt],l,mid,x,y);
int v2=qsum(ls[rt],l,mid,x,y)+qlx(rs[rt],mid+1,r,x,y);
return max(v1,v2);
}
}
int qrx(int rt,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return rx[rt];
int mid=(l+r)>>1;
if(y<=mid) return qrx(ls[rt],l,mid,x,y);
else if(x>mid) return qrx(rs[rt],mid+1,r,x,y);
else
{
int v1=qrx(rs[rt],mid+1,r,x,y);
int v2=qsum(rs[rt],mid+1,r,x,y)+qrx(ls[rt],l,mid,x,y);
return max(v1,v2);
}
}
bool check(int k,int a,int b,int c,int d)
{
int val=0;
if(b+1<c) val+=qsum(root[k],0,n-1,b+1,c-1);
val+=qrx(root[k],0,n-1,a,b);
val+=qlx(root[k],0,n-1,c,d);
return val>=0;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
h[i]=mp(a[i],i);
}
sort(h,h+n);
root[0]=build(0,n-1);
for(int i=1;i<n;i++)
{
update(root[i-1],root[i],0,n-1,h[i-1].sd);
}
int q;
scanf("%d",&q);
int ans=0,p[4];
while(q--)
{
scanf("%d%d%d%d",&p[0],&p[1],&p[2],&p[3]);
for(int i=0;i<4;i++)
p[i]=(p[i]+ans)%n;
sort(p,p+4);
int ll=0,rr=n-1,mid,ret;
while(ll<=rr)
{
mid=(ll+rr)>>1;
if(check(mid,p[0],p[1],p[2],p[3]))
{
ll=mid+1;
ret=mid;
}
else rr=mid-1;
}
ans=h[ret].ft;
printf("%d\n",ans);
}
return 0;
}