Cod sursa(job #2929389)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 25 octombrie 2022 19:23:11
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#define NMAX 250005
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int memo[NMAX][18];//al 2^j lea stramos al nodului i
int parent[NMAX], n, Logn, q;
void preProcess(){
    for (int i = 1; i <= n; i++){
        memo[i][0] = parent[i]; 
        for(int j = 1; j < Logn; j++){
            memo[i][j] = memo[memo[i][j-1]][j-1];
        }       
    }    
}
int findA(int n, int k){
    for(int j = Logn-1; j >= 0; j--){
        if(k >= (1 << j)){
            n = memo[n][j];
            k -= (1 << j);
        }
    }
    return n;
}
int main(){
    fin >> n >> q;
    while((1 << Logn) <= n){
        Logn ++;
    }
    for (int i = 1; i <= n; i++){
        int parent_of_i;
        fin >> parent_of_i;
        parent[i] = parent_of_i;
    }
    preProcess();
    for (int i = 1; i <= q; i++){
        int node, kthAncestor;
        fin >> node >> kthAncestor;
        fout << findA(node, kthAncestor) << '\n';
    }
    
    return 0;
}