Cod sursa(job #3297195)

Utilizator Dv1de2906Barbu David Dv1de2906 Data 22 mai 2025 00:00:33
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 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++ ){
//             up[node][i] = up[up[node][i-1]][i-1];
//         }
//     }

//     // 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';

//         int p = 0;

//         while(P){
//             if ( P & 1 ){
//                 Q = up[Q][p];
//                 if ( Q == 0 ){
//                     break;
//                 }
//             }
//             P >>= 1;
//             p++;
//         }
//         fout << Q << '\n';
//     }

//     return 0;
// }


#include <iostream>
#include <fstream>
#include <vector>

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

int main() {
    int N, M;
    fin >> N >> M;

    int log = 0;
    while ((1 << log) <= N) log++;

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

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

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

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

        int p = 0;
        while (P && Q != 0) {
            if (P & 1)
                Q = up[Q][p];
            P >>= 1;
            p++;
        }

        fout << Q << '\n';
    }

    return 0;
}