Pagini recente » Cod sursa (job #2749123) | Cod sursa (job #1015113) | Cod sursa (job #3176123) | Cod sursa (job #382163) | Cod sursa (job #227358)
Cod sursa(job #227358)
#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) {
if (mark[x]) return;
int* p = parents[x];
if (p[0])
calc_parents(p[0]);
for (unsigned i = 1; p[i - 1]; ++i) {
p[i] = parents[p[i - 1]][i - 1];
}
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);
mark[0] = 1;
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;
}