#include<stdio.h>
#define fin "stramosi.in"
#define fout "stramosi.out"
#define Nmax 350000
struct nod { int x; int y; }; // x - > y
struct ask { int x; int k; int ord; int ans; };
nod v[Nmax];
ask query[Nmax];
int n,m,vf,adr[Nmax],st[Nmax];
FILE *in,*out;
void swap(int &a,int &b) { int aux; aux=a; a=b; b=aux; }
void qsort(int st,int dr) {
int i,j,m;
i=st; j=dr;
m=v[(i+j)/2].x;
do {
while (v[i].x<m) ++i;
while (v[j].x>m) --j;
if (i<=j) {
swap(v[i].x,v[j].x);
swap(v[i].y,v[j].y);
++i; --j;
}
} while (i<j);
if (i<dr) qsort(i,dr);
if (j>st) qsort(st,j);
}
void qsort1(int st,int dr) {
int i,j,m;
i=st; j=dr;
m=query[(i+j)/2].x;
do {
while (query[i].x<m) ++i;
while (query[j].x>m) --j;
if (i<=j) {
swap(query[i].x,query[j].x);
swap(query[i].k,query[j].k);
swap(query[i].ord,query[j].ord);
++i; --j;
}
} while (i<j);
if (i<dr) qsort1(i,dr);
if (j>st) qsort1(st,j);
}
void qsort2(int st,int dr) {
int i,j,m;
i=st; j=dr;
m=query[(i+j)/2].ord;
do {
while (query[i].ord<m) ++i;
while (query[j].ord>m) --j;
if (i<=j) {
swap(query[i].ord,query[j].ord);
swap(query[i].ans,query[j].ans);
++i; --j;
}
} while (i<j);
if (i<dr) qsort2(i,dr);
if (j>st) qsort2(st,j);
}
int search(int st,int dr,int nod) {
int m;
if (st>dr) return -1;
else {
m=(st+dr)/2;
if (query[m].x==nod) {
if (query[m-1].x!=nod) return m;
else return search(st,m-1,nod);
}
else
if (nod<query[m].x) return search(st,m-1,nod);
else return search(m+1,dr,nod);
}
}
void df(int nod) {
int i,poz,p;
st[++vf]=nod;
poz=search(1,m,nod);
//printf("%i: %i\n",nod,poz);
if (poz!=-1)
for (i=poz;query[i].x==nod;++i) {
p=vf-query[i].k;
if (p<0) p=0;
//printf("%i ",st[p]);
query[i].ans=st[p];
}
//for (int j=1;j<=vf;++j) printf("%i ",st[j]);
//printf("\n");
for (i=adr[nod];v[i].x==nod && i;++i)
df(v[i].y);
--vf;
}
int main() {
int i;
freopen(fin,"r",stdin); freopen(fout,"w",stdout);
scanf("%i%i",&n,&m);
for (i=1;i<=n;++i) {
v[i].y=i;
scanf("%i",&v[i].x);
}
for (i=1;i<=m;++i) {
query[i].ord=i;
scanf("%i%i",&query[i].x,&query[i].k);
}
qsort(1,n);
qsort1(1,m);
//for (i=1;i<=n;++i) printf("%i %i\n",v[i].x,v[i].y);
//for (i=1;i<=m;++i) printf("%i %i %i\n",query[i].x,query[i].k,query[i].ord);
for (i=1;i<=n;++i)
if (!adr[v[i].x]) adr[v[i].x]=i;
/*
for (i=0;i<=n;++i) printf("%i ",adr[i]);
*/
df(0);
qsort2(1,m);
for (i=1;i<=m;++i) printf("%i\n",query[i].ans);
fclose(stdin); fclose(stdout);
return 0;
}