Pagini recente » Cod sursa (job #2156376) | Cod sursa (job #1314305) | Cod sursa (job #1795634) | Cod sursa (job #1742449) | Cod sursa (job #1090504)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 250005
#define logmax 20
using namespace std;
int n, m, x, p;
int dp[nmax][logmax], father[nmax];
bool seen[nmax];
vector <int> v[nmax];
void build(int x) {
seen[x] = true;
dp[x][0] = father[x];
for(int i=1; (1<<i)<=n; i++)
dp[x][i] = dp[ dp[x][i-1] ][i-1];
for(int i=0; i<v[x].size(); i++)
if(!seen[v[x][i]]) build(v[x][i]);
}
int find(int p, int x) {
if(p==0) return x;
int i = 0;
while((1<<(i+1)) <= p) i++;
return find(p - (1<<i), dp[x][i]);
}
int main() {
ifstream f("stramosi.in");
ofstream g("stramosi.out");
f>>n>>m;
for(int i=1; i<=n; i++) {
f>>x;
father[i] = x;
if(x) v[x].push_back(i);
}
for(int i=1; i<=n; i++)
if(!seen[i]) build(i);
while(m--)
f>>x>>p,
g<<find(p, x)<<"\n";
return 0;
}