Pagini recente » Cod sursa (job #1642307) | Cod sursa (job #1391744) | Cod sursa (job #2163603) | Cod sursa (job #2197388) | Cod sursa (job #1469661)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 250001
typedef struct membru {
int idx;
struct membru *stramosi[20];
struct membru *children, *next;
} membru;
membru *newmembru (int id) {
membru *m = (membru*) malloc(sizeof(membru));
m->idx = id;
m->stramosi[0] = NULL;
m->children = NULL;
m->next = NULL;
return m;
}
void addchild(membru *f, membru *c) {
c->next = f->children;
f->children = c;
c->stramosi[0] = f;
}
membru *members[MAXN];
int roots[MAXN];
int q[MAXN];
int N, M, P, Q, R;
void build_tree() {
int ql = 0, qr = 1;
int curr;
int i;
membru *c, *s;
while(ql != qr) {
curr = q[ql++];
c = members[curr]->children;
while (c != NULL) {
q[qr++] = c->idx;
c = c->next;
}
if (members[curr]->stramosi[0] == NULL) continue;
for (i = 1; i < 20; i++) {
s = members[curr]->stramosi[i - 1];
if (s) s = s->stramosi[i-1];
members[curr]->stramosi[i] = s;
}
}
}
int ans(int q, int p) {
int i;
membru *c = members[q];
while (p != 0) {
for (i = 1; i < 20 && (1 << i) < p; i++);
i--;
p -= (1 << i);
c = c->stramosi[i];
if (c == NULL) {
return 0;
}
}
return c->idx;
}
int main() {
int i, j, ap, aq;
FILE *fi = freopen("stramosi.in", "r", stdin);
FILE *fo = freopen("stramosi.out", "r", 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(members[j], members[i]);
} else {
roots[R++] = i;
}
}
for (i = 0; i < R; i++) {
q[0] = roots[i];
build_tree();
}
for (i = 0; i < M; i++) {
scanf("%d %d", &aq, &ap);
printf("%d\n", ans(aq, ap));
}
fclose(fi);
fclose(fo);
return 0;
}