#include<bits/stdc++.h>
#define mid ((l + r) >> 1)
#define lchild t[root].Lchild
#define rchild t[root].Rchild
#define new_lchild t[new_root].Lchild
#define new_rchild t[new_root].Rchild
using namespace std;
const int N = 20009,INF = 2e9;
int n,Q;
pair<int,int> a[N];
int ans;
struct node{
int sum,lsum,rsum;
int Lchild,Rchild;
} t[N << 5];
int Root[N],node_cnt;
bool in_range(int l,int r,int L,int R){
return L <= l && r <= R;
}
bool out_range(int l,int r,int L,int R){
return l > R || r < L;
}
void push_up(int root){
t[root].sum = t[lchild].sum + t[rchild].sum;
t[root].lsum = max(t[lchild].lsum,t[lchild].sum + t[rchild].lsum);
t[root].rsum = max(t[rchild].rsum,t[rchild].sum + t[lchild].rsum);
}
void build(int &new_root,int l,int r){
if(!new_root)
new_root = ++node_cnt;
if(l == r){
t[new_root].sum = t[new_root].lsum = t[new_root].rsum = 1;
return;
}
build(new_lchild,l,mid);
build(new_rchild,mid + 1,r);
push_up(new_root);
}
void update(int root,int &new_root,int l,int r,int k){
if(!new_root)
new_root = ++node_cnt;
if(l == r){
t[new_root].sum = -1;
t[new_root].lsum = t[new_root].rsum = 0;
return;
}
if(k <= mid){
new_rchild = rchild;
new_lchild = ++node_cnt;
t[new_lchild] = t[lchild];
update(lchild,new_lchild,l,mid,k);
}
else{
new_lchild = lchild;
new_rchild = ++node_cnt;
t[new_rchild] = t[rchild];
update(rchild,new_rchild,mid + 1,r,k);
}
push_up(new_root);
}
node query(int root,int l,int r,int L,int R){
if(root <= 0){
cout << "Error\n";
exit(0);
}
if(out_range(l,r,L,R))
return (node){-INF,-INF,-INF};
if(in_range(l,r,L,R))
return t[root];
node ql = query(lchild,l,mid,L,R),qr = query(rchild,mid + 1,r,L,R);
return (node){
ql.sum + qr.sum,
max(ql.lsum,ql.sum + qr.lsum),
max(qr.rsum,qr.sum + ql.rsum)
};
}
int q[5];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++){
cin >> a[i].first;
a[i].second = i;
}
sort(a + 1,a + n + 1);
for(int i = 1;i <= n;i++)
Root[i] = ++node_cnt;
build(Root[1],1,n);
for(int i = 2;i <= n;i++)
update(Root[i - 1],Root[i],1,n,a[i - 1].second);
cin >> Q;
while(Q--){
cin >> q[1] >> q[2] >> q[3] >> q[4];
q[1] = (q[1] + ans) % n + 1;
q[2] = (q[2] + ans) % n + 1;
q[3] = (q[3] + ans) % n + 1;
q[4] = (q[4] + ans) % n + 1;
sort(q + 1,q + 5);
int l = 1,r = n;
while(l <= r){
node u = query(Root[mid],1,n,q[1],q[2] - 1);
node v = query(Root[mid],1,n,q[2],q[3]);
node w = query(Root[mid],1,n,q[3] + 1,q[4]);
if(u.rsum + v.sum + w.lsum >= 0){
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
ans = a[ans].first;
cout << ans << '\n';
}
return 0;
}