Pagini recente » Cod sursa (job #1915003) | Cod sursa (job #2487793) | Cod sursa (job #1461675) | Cod sursa (job #2403733) | Cod sursa (job #2511392)
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int NMAX = 250000;
vector <int> G[NMAX + 5];
int lvl[NMAX + 5] , p[NMAX + 5] , t[NMAX + 5] , nr , h;
void dfs1(int u , int l)
{
int j;
h = max(h , l);
for(j = 0 ; j < G[u].size() ; j ++)
dfs1(G[u][j] , l + 1);
}
void dfs2(int u , int l)
{
int j , v;
lvl[u] = l;
if(l < nr)
p[u] = 0;
else
{
if(l % nr == 0)
p[u] = t[u];
else
p[u] = p[t[u]];
}
for(j = 0 ; j < G[u].size() ; j ++)
dfs2(G[u][j] , l + 1);
}
int findt(int x , int l)
{
while(lvl[x] != l)
x = t[x];
return x;
}
int main()
{
freopen("stramosi.in" , "r" , stdin);
freopen("stramosi.out" , "w" , stdout);
int n , q , i , x , y , ly , tx , j;
scanf("%d%d" , &n , &q);
for(i = 1 ; i <= n ; i ++)
{
scanf("%d" , &t[i]);
G[t[i]].push_back(i);
}
dfs1(0 , 0);
nr = (int)sqrt((double)h);
dfs2(0 , 0);
/*for(i = 0 ; i <= n ; i ++)
printf("%d %d %d\n" , t[i] , p[i] , lvl[i]);
for(i = 0 ; i <= n ; i ++)
{
printf("%d: " , i);
for(j = 0 ; j < G[i].size() ; j ++)
printf("%d " , G[i][j]);
printf("\n");
}
printf("%d\n" , nr);*/
for(i = 1 ; i <= q ; i ++)
{
scanf("%d%d" , &x , &y);
ly = lvl[x] - y;
if(ly < 0)
printf("0\n");
else
{
while(lvl[x] / nr != ly / nr)
x = p[x];
tx = findt(x , ly);
printf("%d\n" , tx);
}
}
return 0;
}