#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(i,u,v) for(int i=head[u],v=to[i];i;i=nxt[i],v=to[i])
#define pb emplace_back
using ll=long long;using ull=unsigned long long;using uint=unsigned int;using db=double;using ld=long db;using pii=std::pair<int,int>;using pdi=std::pair<db,int>;using vl=__int128;using uvl=unsigned __int128;
constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr long long INFLL=0x3f3f3f3f3f3f3f3f,MINFLL=0xcfcfcfcfcfcfcfcf;constexpr double INFDB=1e50,eps=1e-9;
template<class _Tp>void chkMax(_Tp &x,const _Tp &y){x<y?x=y:0;}template<class _Tp>void chkMin(_Tp &x,const _Tp &y){x>y?x=y:0;}
constexpr int N=20000+10;int __test_num=1,__test_id;using namespace std;void __init();
int n,q;struct nd{int num,pos;}A[N];bool operator<(const nd &x,const nd &y){return x.num<y.num;}
int tot,root[N],lson[N*50],rson[N*50],lsum[N*50],rsum[N*50],sum[N*50];
void pushup(int rt){
lsum[rt]=max(lsum[lson[rt]],sum[lson[rt]]+lsum[rson[rt]]);
rsum[rt]=max(rsum[rson[rt]],rsum[lson[rt]]+sum[rson[rt]]);
sum[rt]=sum[lson[rt]]+sum[rson[rt]];
}
int build(int l,int r){
int rt=++tot;
if(l==r){
lsum[rt]=rsum[rt]=sum[rt]=1;
return rt;
}
int mid=l+r>>1;
lson[rt]=build(l,mid);rson[rt]=build(mid+1,r);
pushup(rt);
return rt;
}
void update(int &cur,int pre,int l,int r,int pos,int x){
cur=++tot;
lson[cur]=lson[pre],rson[cur]=rson[pre],lsum[cur]=lsum[pre],rsum[cur]=rsum[pre],sum[cur]=sum[pre];
if(l==r){
lsum[cur]=rsum[cur]=sum[cur]=x;
return;
}
int mid=l+r>>1;
if(pos<=mid)update(lson[cur],lson[pre],l,mid,pos,x);
else update(rson[cur],rson[pre],mid+1,r,pos,x);
pushup(cur);
}
int querySum(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R)return sum[rt];
int mid=l+r>>1,ans=0;
if(L<=mid)ans+=querySum(lson[rt],l,mid,L,R);
if(mid<R)ans+=querySum(rson[rt],mid+1,r,L,R);
return ans;
}
int queryLSum(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R)return lsum[rt];
int mid=l+r>>1;
if(R<=mid)return queryLSum(lson[rt],l,mid,L,R);
else if(mid<L)return queryLSum(rson[rt],mid+1,r,L,R);
else return max(queryLSum(lson[rt],l,mid,L,mid),querySum(lson[rt],l,mid,L,mid)+queryLSum(rson[rt],mid+1,r,mid+1,R));
}
int queryRSum(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R)return rsum[rt];
int mid=l+r>>1;
if(R<=mid)return queryRSum(lson[rt],l,mid,L,R);
else if(mid<L)return queryRSum(rson[rt],mid+1,r,L,R);
else return max(queryRSum(rson[rt],mid+1,r,mid+1,R),queryRSum(lson[rt],l,mid,L,mid)+querySum(rson[rt],mid+1,r,mid+1,R));
}
bool check(int x,int a,int b,int c,int d){
int ans=0;
if(b+1<=c-1)ans+=querySum(root[x],1,n,b+1,c-1);
ans+=queryRSum(root[x],1,n,a,b);
ans+=queryLSum(root[x],1,n,c,d);
return ans>=0;
}
int ans,lst;
void __solve(int __test_id){
scanf("%d",&n);
forUp(i,1,n)scanf("%d",&A[i].num),A[i].pos=i;
sort(A+1,A+n+1);
root[1]=build(1,n);
forUp(i,2,n+1)update(root[i],root[i-1],1,n,A[i-1].pos,-1);
scanf("%d",&q);
while(q--){
int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);vector<int> tmp({(a+lst)%n,(b+lst)%n,(c+lst)%n,(d+lst)%n});sort(tmp.begin(),tmp.end());a=tmp[0]+1,b=tmp[1]+1,c=tmp[2]+1,d=tmp[3]+1;
int l=1,r=n,mid;
while(l<=r){
mid=l+r>>1;
if(check(mid,a,b,c,d))l=mid+1,ans=mid;
else r=mid-1;
}
printf("%d\n",lst=A[ans].num);
}
}
signed main(){
__init();
forUp(i,1,__test_num)__solve(i);
return 0;
}
void __init(){
//const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
//scanf("%d",&__test_num);
}