Cod sursa(job #486522)

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

vector <int> v[250005];
int d[250005][21],p,lg;
int str[250005],n,m;
char s[56];

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

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

int main ()
{
    int i,q,l,poz;
    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);
    scanf("\n");
    for(i=1;i<=m;i++)
    {
        fgets(s,sizeof(s),stdin);
        poz=0;q=l=0;
        while(s[poz]>='0' && s[poz]<='9')
        {
            q=q*10+s[poz]-'0';
            poz++;
        }
        poz++;
        while(s[poz]>='0' && s[poz]<='9')
        {
            l=l*10+s[poz]-'0';
            poz++;
        }
        for(p=0;(1<<p)<=l;p++);
        if(str[q]<l)
            printf("0\n");
        else
            printf("%d\n",parc(q,l));
    }
        
    return 0;
}