Cod sursa(job #2053297)

Utilizator SenibelanMales Sebastian Senibelan Data 31 octombrie 2017 17:42:04
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.75 kb
#include <fstream> 

using namespace std;

ifstream in("stramosi.in");
ofstream out("stramosi.out");

const int NMAX = 250005;
int Sol[NMAX][21];
int Log2[NMAX];
int N, M;

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

void Calculate(){
    for(int i = 2; i <= N; ++i)
        Log2[i] = Log2[i / 2] + 1;
    for(int j = 1; (1 << j) <= N; ++j) 
      for(int i = 1; i <= N; ++i)
            Sol[i][j] = Sol[Sol[i][j - 1]][j - 1];
}

int Find(int P, int Q){
    while(P){
        int R = Log2[P];
        Q = Sol[Q][R];
        P -= (1 << R); 
    }
    return Q;
}

int main(){
    Read();
    Calculate();
    while(M--){
        int P, Q;
        in >> Q >> P;
        out << Find(P, Q) << "\n";
    }
    return 0;
}