Cod sursa(job #2884633)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 4 aprilie 2022 14:34:29
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <bits/stdc++.h>

#define maxV 250005

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

std::vector <std::vector <int>> parent;
std::vector <int> roots;
std::vector <int> edge[maxV];

int main() {

    int V, Q;
    fin >> V >> Q;
    parent.resize(V + 1);
    for(int i = 0; i <= V; i ++)
        parent[i].resize(20);

    for(int i = 1; i <= V; i ++) {
        fin >> parent[i][0];
        if(parent[i][0] == 0) {
            roots.push_back(i);
        }
    }

    for(int step = 1, p2 = 1; p2 < V; step ++, p2 <<= 1) {
        for(int i = 1; i <= V; i ++) {
            int prev1 = parent[i][step-1];
            int prev2 = parent[prev1][step-1];
            if(prev1 and prev2)
                parent[i][step] = prev2;
        }
    }

    while(Q --) {
        int node, k;
        fin >> node >> k;
        for(int i = 0; (1 << i) <= k and node; i ++) {
            if((k & (1<<i)) != 0) {
                node = parent[node][i];
            }
        }

        fout << node << '\n';
    }

    return 0;
}