Cod sursa(job #2260913)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 15 octombrie 2018 19:06:11
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("stramosi.in");
ofstream out ("stramosi.out");

int const nmax = 250000;
int const lgmax = 17;
int lg[5 + nmax];
int far[5 + lgmax][5 + nmax];
int n;

inline void computefar(){
  for(int h = 1 ; h <= lgmax ;h++){
    for(int i = 1 ; i <= n ;i++){
      far[h][i] = far[h - 1] [far[h - 1][i]];
    }
  }
}
inline int query(int &node ,int &p){
  while(0 < p && 0 < node){
    node = far[lg[p]][node];
    p -= (1 << lg[p]);
  }
  return node;
}
int main()
{
  int k;
  in >> n >> k;
  for(int i = 1 ; i <= n ;i++){
    in >> far[0][i];
  }
  lg[1] = 0;
  for(int i = 2 ; i <= n ;i++){
    lg[i] = lg[(i >> 1)] + 1;
  }
  computefar();

  int a , b;
  for(int i = 1 ; i <= k ;i++){
    in >> a >> b;
    out << query(a , b) << '\n';
  }
  return 0;
}