Cod sursa(job #1428233)

Utilizator o_micBianca Costin o_mic Data 3 mai 2015 22:30:39
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <algorithm>
#define LL long long
#define DN 250005
using namespace std;
 
int anc[30][DN], power2[30];
 
int biggest_power(int x, int &i){
  int left = 0, right = 20, mid;
  while(left < right - 1){
    mid = (left + right) / 2;
    if(power2[mid] == x){
      i = power2[mid];
      return mid;
    }
    if(power2[mid] < x){
      left = mid;
    }
    else
      right = mid;
  }
  i = power2[left];
  return left;
}
 
int find_anc(int x, int p){
  if(p == 0)
    return x;
  int res;
  int power = biggest_power(p, res);
  return find_anc(anc[power][x], p - res);
}
 
int main() {
  int n, m, x, p;
  ifstream fin("stramosi.in");
  ofstream fout("stramosi.out");
 
  for(int i = 0, j = 1; i <= 20; ++i, j *= 2)
    power2[i] = j;
 
  fin >> n >> m;
  for(int i = 1; i <= n; ++i){
    fin >> anc[0][i];
  }
  for(int j = 1; j < 20; ++j)
    for(int i = 1; i <= n; ++i){
      anc[j][i] = anc[j-1][anc[j-1][i]];
    }
 
  for(int i = 0; i < m; ++i){
    fin >> x >> p;
    fout << find_anc(x, p) << '\n';
  }
  return 0;
}