Cod sursa(job #1471609)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 14 august 2015 16:53:23
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;

const int MAXN = 250000, MAXP = 18;
int N, M, dp[MAXN+1][MAXP+1], father[MAXN+1];
vector < vector <int> > G(MAXN+1);

int p(int x)
{
    while(x)
    {
        int y = ((x^(x-1))&x);
        cout<<y<<endl;
        x -= y;
    }
}

void readData()
{
    scanf("%d %d",&N,&M);

    for(int i = 1; i <= N; i++)
    {
        int x; scanf("%d",&x);
        father[ i ] = x;
        dp[ i ][ 0 ] = x;
        G[ x ].push_back( i );
    }
}

int vis[MAXN+1];

void dfs(int node)
{
    vis[ node ] = 1;

    for(int i = 0; i < G[node].size(); i++)
    {
        int next = G[node][i];

        if( vis[next] == 0 )
        {
            for(int k = 1; dp[ dp[next][k-1] ][k-1] != 0; k++)
                dp[next][k] = dp[ dp[next][k-1] ][k-1];

            dfs(next);
        }
    }

}

void doDfs()
{
    for(int i = 1; i <= N; i++)
        if( father[i] == 0 )
            dfs(i);
}

int greatestPowerOfTwo(int x)
{
    int pwr = 1, ans = 0;

    while( pwr <= x )
    {
        pwr *= 2;
        ans++;
    }

    pwr /= 2, ans--;

    return ans;
}

int querry(int Q, int P)
{
    if( P == 0 )
        return Q;
    else
    {
        int pwr = 1, exp = 0;

        while( pwr <= P )
        {
            pwr *= 2;
            exp++;
        }

        pwr /= 2, exp--;

        return querry( dp[Q][ exp ], P - pwr );
    }
}

void answerQuerries()
{
    for(int i = 1; i <= M; i++)
    {
        int Q, P; scanf("%d %d",&Q,&P);
        printf("%d\n", querry(Q,P));
    }
}

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

    readData();
    doDfs();
    answerQuerries();

    return 0;
}