Cod sursa(job #2087677)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 13 decembrie 2017 22:33:53
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <fstream>
#include <vector>

using namespace std;

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

void Init(vector < int > &log_of) {

  log_of[1] = 0;
  for (int i = 2; i < (int) log_of.size(); i ++) {
    
    log_of[i] = log_of[i / 2] + 1;
  }
}

int main() {
  
  int n, m;
  cin >> n >> m;

  vector < int > log_of(250007);
  vector < int > root(n + 1);
  Init(log_of);
  
  vector < vector < int > > dp(log_of[n] + 2, vector < int > (n + 1));
  for (int i = 1; i <= n; i ++) {
    cin >> root[i];
    dp[0][i] = root[i];
  }
  
  for (int j = 1; j <= log_of[n]; j ++) {
    for (int i = 1; i <= n; i ++) {
      dp[j][i] = dp[j - 1][dp[j - 1][i]];
    }
  }

  for (int i = 1; i <= m; i ++) {
    int q, p;
    cin >> q >> p;
    while (p) {
      q = dp[log_of[p]][q];
      p -= (1 << log_of[p]);
    }
    cout << q << ' ';
  }
}