Cod sursa(job #3233795)

Utilizator MR0L3eXMaracine Constantin Razvan MR0L3eX Data 4 iunie 2024 21:48:34
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include "bits/stdc++.h"

using i64 = long long;

std::vector<std::vector<int>> up;
int LOG = 1;

void init(int n) {
    while ((1 << LOG) <= n) LOG++;
    up = std::vector<std::vector<int>>(n + 1, std::vector<int>(LOG));
}

void bld(int n) {
    for (int k = 1; k < LOG; ++k) {
        for (int i = 1; i <= n; ++i) {
            up[i][k] = up[up[i][k - 1]][k - 1];
        }
    }
}

int jump(int node, int k) {
    int jmp_to = node;
    for (int bit = 0; bit < LOG; ++bit) {
        if (k & (1 << bit)) {
            jmp_to = up[jmp_to][bit];
        }
    }
    return jmp_to;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);

    int n, q;
    std::cin >> n >> q;
    init(n);
    for (int i = 1; i <= n; ++i) {
        int x;
        std::cin >> x;
        up[i][0] = x;
    }
    bld(n);
    while (q--) {
        int node, k;
        std::cin >> node >> k;
        std::cout << jump(node, k) << "\n";
    }
    return 0;
}