Cod sursa(job #3289588)

Utilizator AsandeiStefanAsandei Stefan-Alexandru AsandeiStefan Data 27 martie 2025 16:07:26
Problema Stramosi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>

using namespace std;

const int nmax = 2e5;
const int lmax = 18;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int n, m, l, q, p, dp[lmax + 1][nmax + 1];

int stramos(int q, int p) {
  // Care este al P-lea stramos al membrului cu numarul Q?
  int nod = q;

  // cautare binara pe bitii lui p
  for (int i = 0; i < l; i++) {
    if ((1 << i) & p) {
      nod = dp[i][nod];
    }
  }

  return nod;
}

void precalc() {
  // l = exponentul puterii a lui 2 cea mai mare pana in n
  while ((1 << l) <= n)
    l++;

  for (int i = 1; i < l; i++) {
    for (int j = 1; j <= n; j++) {
      int prv = dp[i - 1][j];
      if (prv != 0)
        dp[i][j] = dp[i - 1][prv];
      else
        dp[i][j] = 0;
    }
  }
}

int main() {
  fin >> n >> m;
  for (int i = 1; i <= n; i++)
    fin >> dp[0][i];
  precalc();

  while (m--) {
    fin >> q >> p;
    fout << stramos(q, p) << '\n';
  }
  return 0;
}