Pagini recente » Cod sursa (job #2463798) | Cod sursa (job #1200841) | Cod sursa (job #1363) | Cod sursa (job #559868) | Cod sursa (job #3301708)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
vector<vector<int>>rmq,tabel;
vector<int>pr,niv;
void dfs(int nod,int pr){
for(auto i : tabel[nod]){
if(i==pr)
continue;
rmq[i][0] = nod;
dfs(i,nod);
}
}
void build(int n){
for(int i=1;i<=18;i++){
for(int j=1;j<=n;j++){
rmq[j][i] = rmq[rmq[j][i-1]][i-1];
}
}
}
void qeu(int nod,int p){
for(int i=17;i>=0;i--){
if((p & (1 << i)))
nod = rmq[nod][i];
}
fout<<nod<<'\n';
}
int main()
{
int n,m;
fin>>n>>m;
tabel.resize(n+1);
rmq.resize(n+1,vector<int>(19));
int root=0;
for(int i=1;i<=n;i++){
int tata;
fin>>tata;
if(tata == 0)
tabel[0].push_back(i);
else
tabel[tata].push_back(i);
}
rmq[0][0] = 0;
dfs(0,0);
build(n);
while(m--){
int q,p;
fin>>q>>p;
qeu(q,p);
}
return 0;
}