Cod sursa(job #3297189)

Utilizator Dv1de2906Barbu David Dv1de2906 Data 21 mai 2025 23:38:55
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>

std::ifstream fin("stramosi.in");
std::ofstream fout("stramosi.out");

int N,M,P,Q;

int main(){
    fin >> N >> M;
    std::vector<int> parent(N + 1);

    int log = 0;

    while ( (1 << log) <= N){
        log++;
    }

    std::vector<std::vector<int>> up(N + 1, std::vector<int>(log));

    for ( int i = 1; i <= N; i++ ){
        fin >> parent[i];
        up[i][0] = parent[i];
    }

    for ( int i = 1; i < log; i++ ){
        for ( int node = 1; node <= N; node++ ){
            if ( up[node][i-1] != 0 ){
                up[node][i] = up[up[node][i-1]][i-1];
            }
            else{
                up[node][i] = 0;
            }
        }
    }

    // for ( int i = 1; i <= N; i++ ){
    //     for ( int j = 0; j < log; j++ ){
    //         std::cout << up[i][j] << ' ';
    //     }
    //     std::cout << '\n';
    // }

    for ( int i = 0; i < M; i++ ){
        fin >> Q >> P;

        for ( int j = 0; j < log; j++ ){
            if ( P & (1<<j) ){
                Q = up[Q][j];
                if ( Q == 0 ){
                    break;
                }
            }
        }
        fout << Q << '\n';
    }
}