Pagini recente » Cod sursa (job #1049497) | Cod sursa (job #137381) | Cod sursa (job #923697) | Cod sursa (job #1888434) | Cod sursa (job #2409207)
#include <bits/stdc++.h>
#define Dim 250006
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int N,M,a,b,root,Cont[Dim],maxim,cnt;
int P,Q,Deep[Dim];
bool ok,viz[Dim],viz2[Dim];
vector < int > V[Dim];
set < pair<int,int> > S[Dim];
set < pair<int,int> > ::iterator it;
void DFS(int nod)
{
viz[nod]=1;
maxim++;
Cont[nod]=maxim;
for(unsigned int i=0;i<V[nod].size();i++)
{
int vecin=V[nod][i];
if(!viz[vecin]) DFS(vecin);
}
}
void BFS(int nod)
{
queue < pair<int,int> > qu;
viz2[nod]=1;
qu.push({nod,1});
S[1].insert({Cont[nod],nod});
Deep[nod]=1;
while(!qu.empty())
{
int vertex=qu.front().first;
int niv=qu.front().second+1;
viz2[vertex]=1;
qu.pop();
for(unsigned int i=0;i<V[vertex].size();i++)
{
int vecin=V[vertex][i];
if(!viz2[vecin])
{
viz2[vecin]=1;
Deep[vecin]=niv;
S[niv].insert({Cont[vecin],vecin});
qu.push({vecin,niv});
}
}
}
}
int main()
{
f>>N>>M;
for(int i=1;i<=N;i++)
{
f>>a;
V[a].push_back(i);
if(!a) ok=1;
}
if(!ok) root=1;
DFS(root);
BFS(root);
for(int i=1;i<=M;i++) // Q-nod
{
f>>Q>>P;
if(Deep[Q]-P<=0) g<<0<<'\n';
else
{
int level=Deep[Q]-P;
int ID=Cont[Q];
it=S[level].lower_bound({ID,level});
it--;
g<<(it->second)<<'\n';
}
}
return 0;
}