Cod sursa(job #3294786)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 28 aprilie 2025 13:16:08
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int DIM = 250003;
const int maxN = 19;
int n, tt;
vector<int> muchii[DIM];
vector<int> ancestor[DIM];

inline void dfs(int nod, int parinte) {
    ancestor[nod][0] = parinte;
    for(int vecin : muchii[nod]) dfs(vecin, nod);
}

inline void prelucru() {
    dfs(0, -1);
    for(int j=1; j<maxN; j++)
        for(int i=1; i<=n; i++)
            if(ancestor[i][j - 1] != -1) ancestor[i][j] = ancestor[ancestor[i][j - 1]][j - 1];
}

inline int findKthAncestor(int nod, int k) {
    for(int i=maxN-1; i>=0; i--) {
        if(k & (1 << i)) {
            if(ancestor[nod][i] == -1) return 0;
            nod = ancestor[nod][i];
        }
    }
    return nod;
}

int main()
{
    fin >> n >> tt;
    for(int i=0; i<=n; i++) {
        ancestor[i].resize(maxN + 1);
        for(int j=0; j<maxN; j++) ancestor[i][j] = -1;
    }
    for(int i=1; i<=n; i++) {
        int tata; fin >> tata;
        muchii[tata].push_back(i);
    }
    prelucru();
    while(tt--) {
        int nod, k; fin >> nod >> k;
        fout << findKthAncestor(nod, k) << '\n';
    }

    return 0;
}