Pagini recente » Cod sursa (job #956) | Cod sursa (job #3159170) | Cod sursa (job #283019) | Cod sursa (job #1738933) | Cod sursa (job #1876965)
#include <cstdio>
#include <vector>
using namespace std;
vector< vector<int> >g(250010);
int dad[250010][18];
void dfs(int node)
{
int i;
for(i=1; i<=17; i++)
dad[node][i]=dad[dad[node][i-1]][i-1];// al 2^i-lea stramos al nodului este al 2^(i-1)-lea stramos al 2^(i-1)-lea stramos al nodului
for(i=0; i<g[node].size(); i++)
dfs(g[node][i]);
}
int stramos(int node,int p)
{
int step;
for(step=0; step<=17; step++)
if((1<<step)&p)
node=dad[node][step];
return node;
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
int n,m,i,node,p,x;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&x);
g[x].push_back(i);
dad[i][0]=x;
}
dfs(0);
for(i=1; i<=m; i++)
{
scanf("%d%d",&node,&p);
printf("%d\n",stramos(node,p));
}
return 0;
}