Cod sursa(job #1930082)

Utilizator stoianmihailStoian Mihail stoianmihail Data 18 martie 2017 15:09:36
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#include <vector>

using std::vector;

#define MAX_M 300000
#define MAX_N 250000

typedef struct {
  int v, next;
} list;

typedef struct {
  int pos, init, next;
} cell;

vector <int> root;
int N, M, buff, ptr;
int adj[MAX_N + 1], fix[MAX_N + 1];
list l[MAX_M + 1];
cell maintain[MAX_M + 1];
int ss, stack[MAX_N + 1];
int answer[MAX_M + 1];

void addEdge(int u, int v) {
  buff++;
  l[buff].v = v;
  l[buff].next = adj[u];
  adj[u] = buff;
}

void push(int u, int pos, int init) {
  ptr++;
  maintain[ptr].pos = pos;
  maintain[ptr].init = init;
  maintain[ptr].next = fix[u];
  fix[u] = ptr;
}

void dfs(int u) {
  int pos, it, v;
  stack[ss++] = u;
  for (pos = adj[u]; pos; pos = l[pos].next) {
    v = l[pos].v;
    dfs(v);
  }
  ss--;
  for (it = fix[u]; it; it = maintain[it].next) {
    answer[maintain[it].init] = stack[ss - maintain[it].pos];
  }
}

int main(void) {
  int i, u, pos;
  FILE *f = fopen("stramosi.in", "r");

  fscanf(f, "%d %d", &N, &M);
  for (i = 1; i <= N; i++) {
    fscanf(f, "%d", &u);
    if (u) {
      addEdge(u, i);
    } else {
      root.push_back(i);
    }
  }
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d", &u, &pos);
    push(u, pos, i);
  }
  fclose(f);

  for (i = 0; i < root.size(); i++) {
    dfs(root[i]);
  }

  freopen("stramosi.out", "w", stdout);
  for (i = 1; i <= M; i++) {
    fprintf(stdout, "%d\n", answer[i]);
  }
  fclose(stdout);
  return 0;
}