Cod sursa(job #640758)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 26 noiembrie 2011 14:20:04
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#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;
}