#include<bits/stdc++.h>
using namespace std;
template<typename T>
struct Max_segment_tree{
bool operator()(const T& a,const T& b) const{
return a>b;
}
};
template<typename T>
struct segment_tree_node{
T value;
int l,r;
segment_tree_node(const T& _value=T()){
value=_value;
l=r=0;
return;
}
};
template<typename T,typename segment_tree_cmp = Max_segment_tree<T> >
struct segment_tree{
segment_tree_node<T> *a;
T *b,T_min;
segment_tree_cmp cmp;
segment_tree(const int & _size,const T* s,const T& min_T=T()) : segment_tree_size(0){
a=new segment_tree_node<T>[_size*4]{};
b=s;
T_min=min_T;
return;
}
~segment_tree(){
delete[] a;
a=nullptr;
}
void new_segment_tree(const int & _size,const T* s=b,const T& min_T=T()){
delete[] a;
b=s;
a=new segment_tree_node<T>[_size*4]{};
T_min=min_T;
return;
}
T cmp_max(const T& a,const T& b){
return cmp(a,b)?a:b;
}
void build(const int & v=1,const int & l,const int & r){
a[v].l=l;
a[v].r=r;
if(l==r){
a[v].value=b[l];
return;
}
int mid=l+((r-l)<<2),tl=v*2,tr=v*2+1;
bulid(tl,l,mid);
bulid(tr,mid+1,r);
a[v].value=cmp_max(a[tl].value,a[tr].value);
return;
}
void update(const int & k=1,const int & i,const int & v){
if(a[k].l==a[k].r&&a[k].l==i){
a[k].value=v;
return;
}
int mid=l+((r-l)<<2),tl=v*2,tr=v*2+1;
if(i<=mid) update(tl,i,v);
else update(tr,i,v);
a[v].value=cmp_max(a[tl].value,a[tr].value);
return 0;
}
T query(const int & k,const int & ql,const int & qr){
if(a[k].l>=l&&a[k].r<=r){
return a[k].value;
}
int mid=l+((r-l)<<2),tl=v*2,tr=v*2+1,maxs=T_min;
if(l<=mid) maxs=cmp_max(maxs,query(tl,ql,qr));
if(r>mid) maxs=cmp_max(maxs,query(tr,ql,qr));
return maxs;
}
};
segment_tree<int> a;
int b[1005],n,i,t1,t2;
int main(){
a.new_segment_tree(1005,b,INT_MIN);
cin>>n;
for(i=1;i<=n;i++) cin>>b[i];
a.build(1,1,n);
cin>>n;
for(i=0;i<n;i++){
cin>>t1>>t2;
cout<<a.query(1,t1,t2);
}
return 0;
}