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