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;
}