Cod sursa(job #227354)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 4 decembrie 2008 10:29:58
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <vector>

#define MAXN        250001
#define MAX_PARENTS 20

int parents[MAXN][MAX_PARENTS];
char mark[MAXN];
int n, m;

void calc_parents(int x) {
  int* p = parents[x];
  if (mark[x]) return;
  
  if (p[0])
    calc_parents(p[0]);

  for (unsigned i = 1;; ++i) {
    int* pp = parents[p[i - 1]];
    if (pp[i - 1])
      p[i] = pp[i - 1];
    else
      break;
  }

  mark[x] = 1;
}

int find_parent(int q, int p) {
  int rank;
  for (rank = 0; parents[q][rank]; ++rank);
  rank--;
  
  for (;p && q; --rank) {
    if (rank < 0) return 0;
    if (1 << rank <= p) {
      q = parents[q][rank];
      p -= 1 << rank;
    }
  }

  return q;
}

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


  scanf("%d %d", &n, &m);
  int vector_size = 2;
  for (int tmp = n; tmp; tmp >>= 1)
    vector_size++;
  for (int i = 1; i <= n; ++i)
    scanf("%d", parents[i] + 0);

  for (int i = 1; i <= n; ++i)
    calc_parents(i);

  for (int i = 0; i < m; ++i) {
    int p, q;
    scanf("%d %d", &q, &p);
    printf("%d\n", find_parent(q, p));
  }

  return 0;
}