Cod sursa(job #486513)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 21 septembrie 2010 21:06:45
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<vector>
using namespace std;

vector <int> v[250005];
int d[250005][25];
int str[250005],n,m;

int parc(int q,int l,int p)
{
    if(!l)
        return q;
    while((1<<p)>l)
        p--;
    return parc(d[q][p],l-(1<<p),p-1);
}

void dfs(int nod,int l)
{
    int i;
    str[nod]=l;
    for(i=1;(1<<i)<=l;i++)
        d[nod][i]=d[d[nod][i-1]][i-1];
    int lim=v[nod].size();
    for(i=0;i<lim;i++)
        dfs(v[nod][i],l+1);
}

int main ()
{
    int i,q,l,put;
    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&d[i][0]);
        if(d[i][0])
            v[d[i][0]].push_back(i);
    }
    for(i=1;i<=n;i++)
        if(!d[i][0])
            dfs(i,0);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&q,&l);
        for(put=0;(1<<put)<=l;put++);
        if(str[q]<l)
            printf("0\n");
        else
            printf("%d\n",parc(q,l,put-1));
    }
        
    return 0;
}