Cod sursa(job #3159820)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 22 octombrie 2023 11:46:24
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

const int MAXN = 250005;
int n, m;
int ancestors[MAXN][20];
vector <int> graph[MAXN];
bool visited[MAXN];

void Build(int node) {
    visited[node] = true;

    for (int e = 1; e < 20; e++) {
        ancestors[node][e] = ancestors[ancestors[node][e - 1]][e - 1];
    }

    for (int child : graph[node]) {
        if (visited[child]) {
            continue;
        }

        Build(child);
    }
}

int GetAncestor(int node, int grade) {
    for (int e = 19; e >= 0; e--) {
        if ((1 << e) <= grade) {
            grade -= (1 << e);
            node = ancestors[node][e];
        }
    }

    return node;
}

int main() {
    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> ancestors[i][0];
        graph[ancestors[i][0]].push_back(i);
    }

    for (int i = 1; i <= n; i++) {
        if (visited[i]) {
            continue;
        }

        Build(i);
    }

    while (m--) {
        int q, p;
        fin >> q >> p;

        fout << GetAncestor(q, p) << '\n';
    }

}