Cod sursa(job #3361871)

Utilizator prodsevenStefan Albu prodseven Data 29 iulie 2026 10:49:54
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("stramosi.in");
ofstream cout("stramosi.out");

int n, m;
vector<vector<int>> anc;
const int LOG_N = 20;

void preprocess_anc() {
    for (int i = 1 ; i < LOG_N ; ++i) {
        for (int j = 1 ; j <= n ; ++j) {
            anc[i][j] = anc[i - 1][anc[i - 1][j]];
        }
    }
}

int find_anc(int node, int up_levels) {
    if (up_levels >= (1 << LOG_N)) return 0;
    for (int i = 0 ; i < LOG_N ; ++i) {
        if (up_levels & (1 << i)) node = anc[i][node];
    }
    return node;
}

int main() {
    cin >> n >> m;
    anc.assign(LOG_N, vector<int>(n + 2));
    for (int node = 1 ; node <= n ; ++node) {
        int parent; cin >> parent;
        anc[0][node] = parent;
    }
    for (int i = 1 ; i <= m ; ++i) {
        int q, p; cin >> q >> p;
        cout << find_anc(q, p) << "\n";
    }
    return 0;
}