Pagini recente » Cod sursa (job #3247651) | Cod sursa (job #815351) | Borderou de evaluare (job #171010) | Cod sursa (job #1945096) | Cod sursa (job #640758)
Cod sursa(job #640758)
#include <stdio.h>
#include <stdlib.h>
typedef struct adjList {
int v;
struct adjList *next;
};
typedef struct queryList {
int level, pos;
struct queryList *next;
};
int n, numTests;
adjList *children[250010];
queryList *queries[250010];
int stack[250010];
int sol[300010];
int roots[250010];
int numRoots;
void read() {
int parent;
numRoots = 0;
FILE *fin = fopen("stramosi.in", "rt");
fscanf(fin, "%d %d", &n, &numTests);
for (int i = 1; i <= n; i++) {
fscanf(fin, "%d", &parent);
if (parent) {
adjList *l = (adjList*)malloc(sizeof(adjList));
l->v = i;
l->next = children[parent];
children[parent] = l;
} else {
roots[numRoots++] = i;
}
}
for (int test = 0; test < numTests; test++) {
int node, level;
fscanf(fin, "%d %d", &node, &level);
queryList *l = (queryList*)malloc(sizeof(queryList));
l->level = level;
l->pos = test;
l->next = queries[node];
queries[node] = l;
}
fclose(fin);
}
void df(int root, int level) {
stack[level] = root;
// Answer all the queries for this node
for (queryList *l = queries[root]; l; l = l->next) {
if (level >= l->level) {
sol[l->pos] = stack[level - l->level];
}
}
for (adjList *l = children[root]; l; l = l->next) {
df(l->v, level + 1);
}
}
inline void process() {
for (int i = 0; i <= numRoots; i++) {
df(roots[i], 0);
}
}
int main() {
read();
process();
FILE *fout = fopen("stramosi.out", "wt");
for (int test = 0; test < numTests; test++) {
fprintf(fout, "%d\n", sol[test]);
}
fclose(fout);
return 0;
}