Pagini recente » Cod sursa (job #590992) | Cod sursa (job #2598917) | Cod sursa (job #2328957) | Cod sursa (job #281458) | Cod sursa (job #227354)
Cod sursa(job #227354)
#include <stdio.h>
#include <vector>
#define MAXN 250001
#define MAX_PARENTS 20
int parents[MAXN][MAX_PARENTS];
char mark[MAXN];
int n, m;
void calc_parents(int x) {
int* p = parents[x];
if (mark[x]) return;
if (p[0])
calc_parents(p[0]);
for (unsigned i = 1;; ++i) {
int* pp = parents[p[i - 1]];
if (pp[i - 1])
p[i] = pp[i - 1];
else
break;
}
mark[x] = 1;
}
int find_parent(int q, int p) {
int rank;
for (rank = 0; parents[q][rank]; ++rank);
rank--;
for (;p && q; --rank) {
if (rank < 0) return 0;
if (1 << rank <= p) {
q = parents[q][rank];
p -= 1 << rank;
}
}
return q;
}
int main() {
freopen("stramosi.in", "rt", stdin);
freopen("stramosi.out", "wt", stdout);
scanf("%d %d", &n, &m);
int vector_size = 2;
for (int tmp = n; tmp; tmp >>= 1)
vector_size++;
for (int i = 1; i <= n; ++i)
scanf("%d", parents[i] + 0);
for (int i = 1; i <= n; ++i)
calc_parents(i);
for (int i = 0; i < m; ++i) {
int p, q;
scanf("%d %d", &q, &p);
printf("%d\n", find_parent(q, p));
}
return 0;
}