Cod sursa(job #2082439)

Utilizator AlexAxeToporan Victor AlexAxe Data 6 decembrie 2017 10:48:08
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");

const int NMax = 25e4 + 2;
int N, M;
int A[21][NMax], Log[NMax], TT[NMax];

int Read(){
    in >> N >> M;
    for (int i = 1; i <= N; ++i)
        in >> TT[i];
}

void Precalculate(){
    for (int i = 2 ; i <= N; ++i)
        Log[i] = Log[i/2] + 1;
    for (int i = 1; i <= N; ++i)
        A[0][i] = TT[i];
    for (int i = 1; (1<<i) <= N; ++i)
        for (int j = 1; j <= N; ++j)
            A[i][j] = A[i-1][A[i-1][j]];
}

int Ancestor(int Q, int P){
    while (P){
        int k = Log[P];
        Q = A[k][Q];
        P -= (1<<k);
    }
    return Q;
}

void SolveAndPrint(){
    Precalculate();
    while (M--){
        int Q, P;
        in >> Q >> P;
        out << Ancestor(Q, P) << '\n';
    }
}

int main()
{
    Read();
    SolveAndPrint();
    return 0;
}