Cod sursa(job #1346961)

Utilizator hopingsteamMatraguna Mihai-Alexandru hopingsteam Data 18 februarie 2015 18:12:33
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <fstream>
#define NMax 250005
#define LMax 20
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int N,M,F[LMax][NMax],Log[NMax];

void Read()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
        fin>>F[0][i];
}

void Precalculate()
{
    for(int i=2;i<=N;i++)
        Log[i] = Log[i/2] + 1;

    for(int i=1;(1<<i)<=N;i++)
        for(int j=1;j<=N;j++)
            F[i][j] = F[i-1][F[i-1][j]];
}

int Ancestor(int Q, int P)
{
   int K;
   while(P)
    {
        K = Log[P];
        Q = F[K][Q];
        P = P - (1<<K);
    }

    return Q;
}

void SolveandPrint()
{
    while(M--)
    {
        int Q,P;
        fin>>Q>>P;
        fout<<Ancestor(Q,P)<<"\n";
    }
}

int main()
{
    Read();
    Precalculate();
    SolveandPrint();
    return 0;
}