Cod sursa(job #2921692)

Utilizator AlexandruBenescuAlexandru Benescu AlexandruBenescu Data 1 septembrie 2022 14:10:41
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
#include <bits/stdc++.h>
#define N_MAX 250005
#define M_MAX 300005
#define X 20
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

vector <int> G[N_MAX];
int T[X][N_MAX], lev[N_MAX], n, node, k;
bool root[N_MAX];

inline int get_lev(int node){
  if (lev[node])
    return lev[node];
  return lev[node] = 1 + get_lev(T[0][node]);
}

inline int get_ancestor(){
  int bit;
  if (k >= lev[node])
    return 0;
  for (bit = X - 1; bit >= 0; bit--)
    if (k & (1 << bit))
      node = T[bit][node];
  return node;
}

int main(){
  int q, i, x;
  fin >> n >> q;
  for (i = 1; i <= n; i++){
    fin >> x;
    if (!x){
      root[i] = true;
      lev[i] = 1;
    }
    else
      T[0][i] = x;
  }
  for (i = 1; i <= n; i++)
    lev[i] = get_lev(i);
  for (x = 1; x < X; x++)
    for (i = 1; i <= n; i++)
      T[x][i] = T[x - 1][T[x - 1][i]];
  for (i = 1; i <= q; i++){
    fin >> node >> k;
    fout << get_ancestor() << "\n";
  }
  return 0;
}