Cod sursa(job #3148565)

Utilizator andrei1807Andrei andrei1807 Data 2 septembrie 2023 16:59:03
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 250003;

vector<int> g[NMAX];
int dp[NMAX][20], tata[NMAX];
bool vis[NMAX];

void dfs(int nod) {
    vis[nod] = true;

    dp[nod][0] = tata[nod];
    for (int i = 1; i <= 17; i++) {
        dp[nod][i] = dp[dp[nod][i - 1]][i - 1];
    }

    for (auto v: g[nod]) {
        if (!vis[v]) {
            dfs(v);
        }
    }
}

int stramos(int p, int q) {
    for (int l = 17; l >= 0; l--) {
        if (q >= (1 << l)) {
            p = dp[p][l];
            q -= (1 << l);
        }
    }
    return p;
}

int main() {

    int n, m;
    fin >> n >> m;
    for (int i = 1 ; i <= n; i++) {
        int x;
        fin >> x;
        tata[i] = x;
        g[x].push_back(i);
    }
    for (int nod = 1; nod <= n; nod++) {
        if (tata[nod] == 0)
            dfs(nod);
    }

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

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

    return 0;
}