Cod sursa(job #227992)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 6 decembrie 2008 07:24:43
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>

#include <vector>

#define MAXN 250000
#define MAXM 350000

typedef std::vector<std::pair<int, int> > queries_t;
typedef std::vector<int> vector_t;

vector_t child[MAXN];
queries_t queries[MAXN];
int parent[MAXN];
int stack[MAXN];
int answer[MAXM];

int m, n, k;

void df(int node) {
  stack[k] = node;

  for (queries_t::iterator it = queries[node].begin();
       it != queries[node].end(); ++it) {
    int index = it->first;
    int deg   = it->second;
    answer[index] = (deg > k) ? 0 : stack[k - deg] + 1;
  }

  ++k;
  for (vector_t::iterator it = child[node].begin();
       it != child[node].end(); ++it)
    df(*it);
  --k;
}

int main() {
  freopen("stramosi.in", "rt", stdin);
  freopen("stramosi.out", "wt", stdout);

  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; ++i) {
    int p;
    scanf("%d", &p); --p;
    child[p].push_back(i);
    parent[i] = p;
  }
   
  for (int i = 0; i < m; ++i) {
    int p, q;
    scanf("%d %d", &q, &p); --q;
    queries[q].push_back(std::make_pair(i, p));
  }

  for (int i = 0; i < n; ++i)
    if (parent[i] == -1) {
      k = 0;
      df(i);
    }

  for (int i = 0; i < m; ++i)
    printf("%d\n", answer[i]);

  return 0;
}