Pagini recente » Cod sursa (job #1423271) | Cod sursa (job #2826755) | Cod sursa (job #2204128) | Cod sursa (job #3208182) | Cod sursa (job #2644110)
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#define MMAX 300001
#define NMAX 250002
using namespace std;
int answers[MMAX];
int level[NMAX];
int n, m;
struct Query
{
int degree;
int ord;
Query(int _deg, int _ord) : degree(_deg), ord(_ord) {}
};
struct Node
{
vector<Query> queries;
vector<int> descendants;
} nodes[NMAX];
void read()
{
cin >> n >> m;
for(int i = 1; i <= n; ++i)
{
int parent;
cin >> parent;
nodes[parent].descendants.push_back(i);
}
for(int i = 0; i < m; ++i)
{
int p, q;
cin >> q >> p;
nodes[q].queries.push_back(Query(p, i));
}
}
void solve(int node, int depth)
{
level[depth] = node;
Node & currentNode = nodes[node];
for(int i = 0; i < currentNode.queries.size(); ++i)
{
Query & currentQuery = currentNode.queries[i];
answers[currentQuery.ord] = level[depth - currentQuery.degree];
}
for(int i = 0; i < currentNode.descendants.size(); ++i)
{
solve(currentNode.descendants[i], depth + 1);
}
}
void printAnswers()
{
for(int i = 0; i < m; ++i)
cout << answers[i] << '\n';
}
int main() {
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
read();
solve(0, 0);
printAnswers();
return 0;
}