Cod sursa(job #1460519)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 12 iulie 2015 22:48:56
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

const int MAXN = 250000, MAXM = 300000, MAXC = 17;

int N, M, a[MAXN+1][MAXC+1], t[MAXN+1], viz[MAXN+1], p2[MAXN+1], hig[MAXN+1];
vector <int> G[MAXN+1];

int h(int x)
{
    int rx = x;

    if( hig[ x ] != 0 )
        return hig[ x ];

    while((x & (x - 1)) != 0)
        x = x - 1;

    hig[ rx ] = x;

    return x;
}

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

    for(int i = 1; i <= N; i++){

        scanf("%d",&t[ i ]);

        if(t[ i ] != 0)
        {
            G[ t[ i ] ].push_back( i );
            a[ i ][ 0 ] = t[ i ];
        }
        else
            a[ i ][ 0 ] = i;
    }
}

void dfs(int x)
{
    viz[ x ] =1;

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

        if( viz[ next ] == 0 )
        {
            for(int k = 1; k <= MAXC; k++)
                if( t[ a[ next ][ k - 1 ] ] )
                    a[ next ][ k ] = a[ a[ next ][ k - 1 ] ][ k - 1 ];

            dfs(next);
        }
    }
}

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

void printMatrix()
{
    for(int i = 1; i <= N; i++)
    {
        cout<<i<<' '<<' ';
        for(int j = 0; j <= 4; j++)
            cout<<a[ i ][ j ]<<' ';
        cout<<endl;
    }
}

int pow2(int x)
{
    int nr = 0, xr = x;

    if( x == 1 )
        return 0;

    if( p2[ x ] != 0 )
        return p2[ x ];

    while( x != 1 )
    {
        x = x/2;
        nr++;
    }

    p2[ xr ] = nr;

    return nr;
}
int querry(int Q, int P)
{
    int answer;

    while( P )
    {
        answer = a[ Q ][ pow2(h(P)) ];
        Q = answer;
        P -= h(P);
    }

    return answer;
}

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

int main()
{
    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);
    readData();
    doDfs();
    //printMatrix();
    answerQuerries();
}