Pagini recente » grigore-moisil-2008 | Cod sursa (job #1293435) | Profil azotlichid | Cod sursa (job #3292289) | Cod sursa (job #3294787)
#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> ancestor[DIM];
inline void prelucru() {
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;
ancestor[i][0] = tata;
}
prelucru();
while(tt--) {
int nod, k; fin >> nod >> k;
fout << findKthAncestor(nod, k) << '\n';
}
return 0;
}