Pagini recente » Cod sursa (job #2578492) | Cod sursa (job #2675116) | Cod sursa (job #322827) | Cod sursa (job #913351) | Cod sursa (job #1147622)
#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;
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)
{
int pz;
stak.push_back(k);
if(k){
pz = lower_bound(Questions+1,Questions+N+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(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
DFS(*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;
}