Cod sursa(job #2792892)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 2 noiembrie 2021 14:12:17
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <fstream>
#include <vector>

using namespace std;

const int N = 25e4 + 5;
const int LOG = 18;

vector<int> f[N], rad;
int up[N][LOG], nr[N];

void dfs(int nod) {
  for (auto fiu : f[nod]) {
    up[fiu][0] = nod;
    nr[fiu] = nr[nod] + 1;
    for (int i = 1; i < LOG; ++i)
      up[fiu][i] = up[up[fiu][i - 1]][i - 1];
    dfs(fiu);
  }
}

int main() {
  ifstream cin("stramosi.in");
  ofstream cout("stramosi.out");
  int n, q;
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) {
    int j;
    cin >> j;
    if (j == 0)
      rad.push_back(i);
    else
      f[j].push_back(i);
  }
  for (auto i : rad)
    dfs(i);
  while (q--) {
    int nod, k;
    cin >> nod >> k;
    if (k > nr[nod]) {
      cout << "0\n";
      continue;
    }
    for (int i = LOG - 1; i >= 0; --i)
      if (k & (1 << i))
        nod = up[nod][i];
    cout << nod << "\n";
  }
  cin.close();
  cout.close();
  return 0;
}