Cod sursa(job #3291844)

Utilizator rrfeierFeier Raul rrfeier Data 5 aprilie 2025 21:03:03
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <bits/stdc++.h>
#include <fstream>

using namespace std;

int v[200005];
int anc[20][200005];
bool used[200005];

void dfs(int node) {
  used[node] = true;

  anc[0][node] = v[node];

  for (int i = 1; i <= 18; i++) {
    anc[i][node] = anc[i - 1][anc[i - 1][node]];
  }

  if (!used[node])
    dfs(v[node]);
}

int query(int node, int steps) {
  for (int i = 18; i >= 0; i--) {
    if (steps >= (1 << i)) {
      node = anc[i][node];
      steps -= (1 << i);
    }
  }

  return node;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  ifstream cin{"stramosi.in"};
  ofstream cout{"stramosi.out"};

  int N, Q;
  cin >> N >> Q;

  for (int i = 1; i <= N; i++) {
    cin >> v[i];
  }

  for (int i = 1; i <= N; i++) {
    if (!used[i])
      dfs(i);
  }

  while (Q--) {
    int x, k;
    cin >> x >> k;

    cout << query(x, k) << '\n';
  }

  return 0;
}