Pagini recente » Cod sursa (job #2614731) | Cod sursa (job #637933) | Cod sursa (job #1436200) | Cod sursa (job #2584562) | Cod sursa (job #191751)
Cod sursa(job #191751)
#include <stdio.h>
#include <stdlib.h>
typedef struct list {
int v;
struct list *next;
};
FILE *fin;
int n, numTests;
// a[n][k] = the node 2^k levels above n.
int a[262144][20];
list *children[262144];
int numUnknown;
int sol[300010];
void read() {
int parent;
fscanf(fin, "%d %d", &n, &numTests);
for (int i = 1; i <= n; i++) {
fscanf(fin, "%d", &parent);
a[i][0] = parent;
for (int j = 1; j < 20; j++) {
a[i][j] = 0;
}
if (parent) {
list *l = (list*)malloc(sizeof(list));
l->v = i;
l->next = children[parent];
children[parent] = l;
}
}
numUnknown = 0;
}
void df(int root) {
int log = 1;
int node = a[root][0];
while (node) {
node = a[node][log - 1];
a[root][log++] = node;
}
for (list *l = children[root]; l; l = l->next) {
df(l->v);
}
}
inline void preprocess() {
for (int i = 1; i <= n; i++) {
if (!a[i][0]) {
df(i);
}
}
// for (int i = 1; i <= n; i++) {
// for (int j = 0; j <20; j++) {
// printf("%d ", a[i][j]);
// }
// printf("\n");
// }
}
inline int query(int node, int level) {
int log = 0;
while (level && node) {
if (level & 1) {
node = a[node][log];
}
log++;
level >>= 1;
}
return node;
}
int main() {
fin = fopen("stramosi.in", "rt");
read();
preprocess();
for (int test = 0; test < numTests; test++) {
int node, level;
fscanf(fin, "%d %d", &node, &level);
sol[test] = query(node, level);
}
fclose(fin);
FILE *fout = fopen("stramosi.out", "wt");
for (int test = 0; test < numTests; test++) {
fprintf(fout, "%d\n", sol[test]);
}
fclose(fout);
return 0;
}