Pagini recente » Cod sursa (job #287987) | Cod sursa (job #1510614) | Cod sursa (job #2029008) | Cod sursa (job #1294785) | Cod sursa (job #963271)
Cod sursa(job #963271)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define Nmax 250010
int N, M, X, Y, Rad, Stack[2 * Nmax], Father[Nmax], Level[Nmax], SqrtAncestor[Nmax], Pos;
vector<int> G[Nmax];
void DFS(int Node)
{
Pos ++;
if(Pos - Rad > 0) SqrtAncestor[Node] = Stack[Pos - Rad];
Stack[Pos] = Node;
for(int i = 0; i < G[Node].size(); ++ i)
{
Level[ G[Node][i] ] = Level[Node] + 1;
DFS(G[Node][i]);
}
Pos --;
}
int main()
{
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
scanf("%i %i", &N, &M);
Rad = int(sqrt(N));
for(int i = 1; i <= N; ++ i)
{
scanf("%i", &Father[i]);
if(Father[i] != 0) G[Father[i]].push_back(i);
}
for(int i = 1; i <= N; ++ i)
if(!Level[i])
{
Level[i] = 1;
DFS(i);
}
for(int i = 1; i <= M; ++ i)
{
int Node, P, UpLevel;
scanf("%i %i", &Node, &P);
UpLevel = Level[Node] - P;
if(UpLevel <= 0)
{
printf("0\n");
continue;
}
while(Level[ SqrtAncestor[Node] ] >= UpLevel)
Node = SqrtAncestor[Node];
while(Level[Node] > 0 && Level[Node] != UpLevel)
Node = Father[Node];
printf("%i\n", Node);
}
return 0;
}