Pagini recente » Cod sursa (job #2046073) | Cod sursa (job #1058407) | Cod sursa (job #1206759) | Clasamentul arhivei ACM | Cod sursa (job #1453233)
#include <bits/stdc++.h>
using namespace std;
typedef int var;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
#define MAXN 250001
var PathP[MAXN], Pos[MAXN];
vector<var> Paths[MAXN];
var In[MAXN];
var paths = 1;
void addTo(var node, var path) {
In[node] = path;
Pos[node] = Paths[path].size();
Paths[path].push_back(node);
}
void add(var node, var father) {
if(Pos[father] == Paths[In[father]].size() - 1)
addTo(node, In[father]);
else {
addTo(node, ++paths);
PathP[paths] = father;
}
}
var query(var node, var k) {
while(true) {
if(node == 0) return 0;
if(Pos[node] >= k) return Paths[In[node]][Pos[node]-k];
k -= Pos[node] + 1;
node = PathP[In[node]];
}
}
vector<var> G[MAXN];
void dfs(var node) {
for(auto vec : G[node]) {
add(vec, node);
dfs(vec);
}
}
int main() {
var n, m, type, x, y, cur = 0;
fin>>n>>m;
addTo(0, 0);
var p;
var root = 1;
for(var i=1; i<=n; i++) {
fin>>p;
G[p].push_back(i);
}
dfs(0);
while(m--) {
fin>>x>>y;
fout<<query(x, y)<<'\n';
}
return 0;
}