#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 100001
using namespace std;
int n,m,l_child[N*18],r_child[N*18],root[N],sum[N*18],tot,id;
int a[N],has[N];
int x,y,k,ans,T;
void build(int pre,int &now,int key,int l,int r)
{
sum[now=++id]=sum[pre]+1;
if(l==r) return;
int mid=(l+r)/2;
if(key<=mid)
{
r_child[now]=r_child[pre];
build(l_child[pre],l_child[now],key,l,mid);
}
else
{
l_child[now]=l_child[pre];
build(r_child[pre],r_child[now],key,mid+1,r);
}
}
void discrete()
{
sort(a+1,a+n+1);
tot=unique(a+1,a+n+1)-(a+1);
for(int i=1;i<=n;i++) has[i]=lower_bound(a+1,a+tot+1,has[i])-a;
}
int search(int s,int t,int k,int l,int r)
{
if(l==r) return l;
int tmp=sum[l_child[t]]-sum[l_child[s]];
int mid=(l+r)/2;
if(tmp>=k) return search(l_child[s],l_child[t],k,l,mid);
else return search(r_child[s],r_child[t],k-tmp,mid+1,r);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),has[i]=a[i];
discrete();
for(int i=1;i<=n;i++) build(root[i-1],root[i],has[i],1,tot);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
k=(y-x)/2+1;//转化
ans=search(root[x-1],root[y],k,1,tot);
printf("%d\n",a[ans]);
}
}