Cod sursa(job #1876965)

Utilizator UrsuDanUrsu Dan UrsuDan Data 12 februarie 2017 19:51:50
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#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;
}