Cod sursa(job #227358)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 4 decembrie 2008 10:36:19
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 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) {
  if (mark[x]) return;

  int* p = parents[x];
  
  if (p[0])
    calc_parents(p[0]);

  for (unsigned i = 1; p[i - 1]; ++i) {
    p[i] = parents[p[i - 1]][i - 1];
  }

  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);

  mark[0] = 1;
  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;
}