Pagini recente » Cod sursa (job #1401768) | Cod sursa (job #502844) | Cod sursa (job #3167145) | Cod sursa (job #1763327) | Cod sursa (job #1147643)
#include <cstdio>
#include <algorithm>
#include <vector>
#define Mmax 300005
#define Nmax 250005
using namespace std;
pair< pair<int,int>,int> Questions[Mmax];
vector<int> G[Nmax];
vector<int> stak; /// simulam stiva
int answer[Mmax];
int N,Q,pz;
void read()
{
int x;
scanf("%d%d",&N,&Q);
for(int i = 1; i <= N; ++i)
{
scanf("%d",&x);
G[x].push_back(i);
}
for(int i = 1; i <= Q; ++i)
{
Questions[i].second = i;
scanf("%d%d",&Questions[i].first.first,&Questions[i].first.second);
}
sort(Questions+1,Questions+Q+1);
}
void DFS(int k)
{
stak.push_back(k);
if(k){
pz = lower_bound(Questions+1,Questions+Q+1,make_pair(make_pair(k,0),0)) - Questions;
while(Questions[pz].first.first == k)
{
int y = (stak.size() - Questions[pz].first.second);
if(y > 1)
answer[Questions[pz].second] = stak[y - 1];
++pz;
}
}
for(int it = 0; it < G[k].size(); ++ it)
DFS(G[k][it]);
stak.pop_back();
}
void solve()
{
DFS(0);
for(int i = 1; i <= Q; ++i)
printf("%d\n",answer[i]);
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
read();
solve();
return 0;
}