Pagini recente » Cod sursa (job #935163) | Cod sursa (job #1504534) | Cod sursa (job #2129456) | Cod sursa (job #2933154) | Cod sursa (job #1899446)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <algorithm>
#include <map>
#include <iomanip>
using namespace std;
const int NMax = 250001;
int n,m,x,y;
int viz[NMax];
int T2[20][NMax];
vector<int> G[NMax];
void dfs(int nod, int tata){
viz[nod] = 1;
T2[0][nod] = tata;
for(int i = 1; (1 << i) <= n; ++i)
T2[i][nod] = T2[i - 1][T2[i - 1][nod]];
for(int i = 0; i < G[nod].size(); ++i){
if(!viz[G[nod][i]]){
dfs(G[nod][i],nod);
}
}
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i){
scanf("%d",&x);
if(x != 0){
G[x].push_back(i);
G[i].push_back(x);
}
}
for(int i = 1; i <= n; ++i){
if(!viz[i]){
dfs(i,0);
}
}
for(int i = 1; i <= m; ++i){
scanf("%d%d",&x,&y);
for(int j = 0; (1 << j) <= n; ++j){
if(y & (1<<j)){
y -= j;
x = T2[j][x];
}
}
printf("%d\n",x);
}
return 0;
}