Pagini recente » Cod sursa (job #1079825) | Cod sursa (job #1745540) | Cod sursa (job #1359086) | Cod sursa (job #1376945) | Cod sursa (job #2073622)
#include <bits/stdc++.h>
#define DM 250005
#define pb push_back
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
vector<int>v[DM],leaf[DM];
int n,m,curr,k,fr[DM],aux;
set<int>roots;
struct elm{
int ind, dist;
}correspLeaf[DM];
void getAns(int nod, int k){
if(roots.find(nod)!=roots.end()){
fout<<0<<'\n';
return;
}
int leafInd = correspLeaf[nod].ind,dist = correspLeaf[nod].dist;
if(dist+k>=leaf[leafInd].size()){
fout<<0<<'\n';
return;
}
fout<<leaf[leafInd][dist+k]<<'\n';
}
void construct(int nod){
int i = nod;
leaf[i].pb(i);
correspLeaf[i]={i,0};
while(v[nod].size()){
leaf[i].pb(v[nod][0]);
nod=v[nod][0];
correspLeaf[nod]={i,leaf[i].size()};
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;++i){
fin>>aux;
if(!aux) roots.insert(i);
else v[i].pb(aux), fr[aux]++;
}
for(int i=1;i<=n;++i) if(!fr[i])
construct(i);
for(int i=1;i<=m;++i){
fin>>curr>>k;
getAns(curr,k);
}
return 0;
}