u_lcp @ 2024-07-23 14:55:53
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
#define mid ((l+r)>>1)
#define ls t[o].lc
#define rs t[o].rc
int n;
struct sgt
{
int lmx,rmx,sum,lc,rc;
}t[N<<5];
int cnt,rt[N];
void pushup(int o)
{
t[o].lmx=max(t[ls].lmx,t[ls].sum+t[rs].lmx);
t[o].rmx=max(t[rs].rmx,t[rs].sum+t[ls].rmx);
t[o].sum=t[ls].sum+t[rs].sum;
}
void build(int &o,int l,int r)
{
o=++cnt;
if(l==r)
{
t[o].lmx=t[o].rmx=t[o].sum=1;
return;
}
build(ls,l,mid),build(rs,mid+1,r);
pushup(o);
}
void modify(int &o,int p,int l,int r,int idx)
{
t[o=++cnt]=t[p];
if(l==r)
{
t[o].lmx=t[o].rmx=t[o].sum=-1;
return;
}
if(idx<=mid)modify(ls,t[p].lc,l,mid,idx);
else modify(rs,t[p].rc,mid+1,r,idx);
pushup(o);
}
sgt query(int o,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return t[o];
if(qr<=mid)return query(ls,l,mid,ql,qr);
else if(ql>mid)return query(rs,mid+1,r,ql,qr);
else
{
sgt a=query(ls,l,mid,ql,qr),b=query(rs,mid+1,r,ql,qr);
return (sgt){max(a.lmx,a.sum+b.lmx),max(b.rmx,b.sum+a.rmx),a.sum+b.sum,0,0};
}
}
int aa[N],id[N];
int a,b,c,d,kk;
bool check(int x)
{
sgt ans;int res=0;
if(b+1<=c-1)ans=query(rt[x],1,n,b+1,c-1);res+=ans.sum;
if(a<=b)ans=query(rt[x],1,n,a,b);res+=ans.rmx;
if(c<=d)ans=query(rt[x],1,n,c,d);res+=ans.lmx;
return res>=0;
}
bool cmp(int x,int y)
{
return aa[x]<aa[y];
}
int Q,q[10];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&aa[i]),id[i]=i;
kk=n;
build(rt[1],1,kk);
sort(id+1,id+n+1,cmp);
for(int i=2;i<=n;i++)
{
modify(rt[i],rt[i-1],1,kk,id[i-1]);
}
scanf("%d",&Q);
for(int i=1,x=0;i<=Q;i++)
{
scanf("%d%d%d%d",&q[0],&q[1],&q[2],&q[3]);
for(int j=0;j<=3;j++)q[i]=(q[i]+x)%n+1;
sort(q,q+4);
a=q[0],b=q[1],c=q[2],d=q[3];
int l=1,r=n;
while(l<=r)
{
if(check(mid))x=aa[id[mid]],l=mid+1;
else r=mid-1;
}
printf("%d\n",x);
}
return 0;
}
by u_lcp @ 2024-07-25 20:54:56
已过,此帖结