Cod sursa(job #2501088)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 29 noiembrie 2019 07:53:16
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <iostream>
#include <cstdio>
#define NMAX 250000

using namespace std;

int n, m;
int dad[NMAX + 5], log[NMAX + 5];
int r[18][NMAX + 5];

void gen_log() {
  int b = 1;

  log[1] = 0;
  for(int i = 2; i <= n; i++)
    if(2 * b == i) {
      log[i] = log[b] + 1;
      b *= 2;
    }
    else
      log[i] = log[b];
}

void gen_rmq() {
  for(int i = 0; i <= log[n]; i++)
    for(int j = 1; j <= n; j++)
      if(i == 0)
        r[i][j] = dad[j];
      else
        r[i][j] = r[i - 1][r[i - 1][j]];
}

int stramos(int q, int p) {
  int l = log[p];

  if((1 << l) == p)
    return r[l][q];
  return stramos(r[l][q], p ^ (1 << l));
}

int main() {
  freopen("stramosi.in", "r", stdin);
  freopen("stramosi.out", "w", stdout);
  int x, q, p;

  scanf("%d %d", &n, &m);
  gen_log();
  for(int i = 1; i <= n; i++) {
    scanf("%d", &x);
    dad[i] = x;
  }
  gen_rmq();

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

  return 0;
}