Pagini recente » Cod sursa (job #715483) | Cod sursa (job #3161750) | Cod sursa (job #2750554) | Cod sursa (job #2891214) | Cod sursa (job #227992)
Cod sursa(job #227992)
#include <stdio.h>
#include <vector>
#define MAXN 250000
#define MAXM 350000
typedef std::vector<std::pair<int, int> > queries_t;
typedef std::vector<int> vector_t;
vector_t child[MAXN];
queries_t queries[MAXN];
int parent[MAXN];
int stack[MAXN];
int answer[MAXM];
int m, n, k;
void df(int node) {
stack[k] = node;
for (queries_t::iterator it = queries[node].begin();
it != queries[node].end(); ++it) {
int index = it->first;
int deg = it->second;
answer[index] = (deg > k) ? 0 : stack[k - deg] + 1;
}
++k;
for (vector_t::iterator it = child[node].begin();
it != child[node].end(); ++it)
df(*it);
--k;
}
int main() {
freopen("stramosi.in", "rt", stdin);
freopen("stramosi.out", "wt", stdout);
scanf("%d %d", &n, &m);
for (int i = 0; i < n; ++i) {
int p;
scanf("%d", &p); --p;
child[p].push_back(i);
parent[i] = p;
}
for (int i = 0; i < m; ++i) {
int p, q;
scanf("%d %d", &q, &p); --q;
queries[q].push_back(std::make_pair(i, p));
}
for (int i = 0; i < n; ++i)
if (parent[i] == -1) {
k = 0;
df(i);
}
for (int i = 0; i < m; ++i)
printf("%d\n", answer[i]);
return 0;
}