Cod sursa(job #2072170)

Utilizator eragon0502Dumitrescu Dragos eragon0502 Data 21 noiembrie 2017 15:27:41
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <vector>

using namespace std;

vector <int> v[250005];
int a[250005][23],st=0,dr=0;
int q[250005];

void dfs(int poz)
{
    if(poz!=0)
    {
        int p=0;
        while(dr-(1<<p)>=st)
        {
            a[poz][p]=q[dr-(1<<p)];
            ++p;
        }
    }
    for(int i=0;i<v[poz].size();++i)
    {
        ++dr;
        q[dr]=v[poz][i];
        dfs(v[poz][i]);
    }
    --dr;
}

int main()
{
    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);
    int n,m,x,y;

    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;++i)
    {
        scanf("%d",&x);
        v[x].push_back(i);
    }

    dfs(0);



    for(int i=1;i<=m;++i)
    {
        scanf("%d %d",&x,&y);
        while(y>0)
        {
            int M=1<<28;
            int k=0;
            while((M&y)==0)
            {
                ++k;
                M>>=1;
                if(M==0)
                    break;
            }
            x=a[x][28-k];
            y-=M;
        }
        printf("%d\n",x);
    }

    return 0;
}