Cod sursa(job #3132980)

Utilizator RolandPetreanPetrean Roland RolandPetrean Data 24 mai 2023 16:54:45
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.91 kb
// https://infoarena.ro/problema/stramosi
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

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

const int MAXN=250005;

vector<int> adj[MAXN];
bool vis[MAXN];
int anc[18][MAXN];

void dfs(int h, int v, int p) {
  vis[v] = true;

  if (h==0) anc[h][v] = p;
  else anc[h][v] = anc[h-1][anc[h-1][v]];

  for (int u:adj[v]) {
    if (u != p) dfs(h, u, v);
  }
}

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

  for (int i=1; i<=n; ++i) {
    int x;
    fin>>x;
    if (x!=0) {
      adj[x].push_back(i);
      adj[i].push_back(x);
    }
  }

  for (int h=0; h<18; ++h) {
    for (int i=1; i<=n; ++i) vis[i] = false;
    for (int i=1; i<=n; ++i) {
      if (!vis[i]) dfs(h, i, 0);
    }
  }

  while (m--) {
    int q, p;
    fin>>q>>p;

    int curr=q, lg=log2(p);
    for (int j=lg; p; --j) {
      curr = anc[j][curr];
      p -= (1<<j);
    }

    fout<<curr<<endl;
  }
}