Cod sursa(job #1471780)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 15 august 2015 09:12:38
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <deque>
using namespace std;

const int MAXN = 250000, MAXP = 17;
int N, M, dp[MAXN+1][MAXP+1], father[MAXN+1];
deque < deque <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 dfsIterativ(int node)
{
    queue <int> c;
    c.push(node);
    vis[node] = 1;

    while(c.empty() == false)
    {
        int curr = c.front();

        if(G[curr].size() != 0)
        {
            int next = G[curr][0];

            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];

                c.push(next);
            }

            G[curr].pop_front();
        }
        else
        {
            c.pop();
        }
    }
}




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;
}