Pagini recente » Cod sursa (job #853039) | Cod sursa (job #1653567) | Cod sursa (job #2892769) | Cod sursa (job #2197139) | Cod sursa (job #1469827)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 250001
typedef struct membru {
int idx;
struct membru *children, *next;
} membru;
membru *members[MAXN];
int stramosi[MAXN][20];
int N, M, P, Q, R;
membru *newmembru (int idx) {
membru *m = (membru*) malloc(sizeof(membru));
m->idx = idx;
m->children = NULL;
m->next = NULL;
return m;
}
void addchild(int f, int c) {
members[c]->next = members[f]->children;
members[f]->children = members[c];
stramosi[c][0] = f;
}
int ans(int q, int p) {
int i;
while (p != 0) {
for (i = 1; i < 20 && (1 << i) < p; i++);
i--;
p -= (1 << i);
q = stramosi[q][i];
if (q == 0) return 0;
}
return q;
}
int main() {
int i, j;
int qs[300000][2];
FILE *fi = freopen("stramosi.in", "r", stdin);
FILE *fo = freopen("stramosi.out", "w", stdout);
scanf("%d %d", &N, &M);
for (R = 0, i = 1; i <= N; i++) {
members[i] = newmembru(i);
scanf("%d", &j);
if (j != 0) {
addchild(j, i);
}
}
for (i = 1; i < 20; i++) {
for (j = 1; j <= N; j++) {
if (stramosi[stramosi[j][i-1]][i-1] == 0) break;
stramosi[j][i] = stramosi[stramosi[j][i-1]][i-1];
}
}
for (i = 0; i < M; i++) {
scanf("%d %d", &qs[i][0], &qs[i][1]);
}
for (i = 0; i < M; i++) {
printf("%d\n", ans(qs[i][0], qs[i][1]));
}
fclose(fi);
fclose(fo);
return 0;
}