Cod sursa(job #3322936)

Utilizator Gerald123Ursan George Gerald123 Data 16 noiembrie 2025 11:57:40
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
/// patratele
#include <bits/stdc++.h>
using namespace std;

#define MOD 9901

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

int i, vf, oi[200010], level[200010], rmq[200010][100], fir[100010], n, m, x, j, y, fr1, fr2;
vector<int> v[100010];

void dfs(int x, int lvl)
{
  oi[++vf] = x;
  level[vf] = lvl;
  rmq[vf][0] = vf;
  if (fir[x] == 0)
    fir[x] = vf;
  for (auto it : v[x])
  {
    dfs(it, lvl + 1);
    oi[++vf] = x;
    level[vf] = lvl;
    rmq[vf][0] = vf;
  }
}

int rez(int st, int dr)
{
  int l = dr - st + 1;
  int ll = log2(l);
  if (level[rmq[st][ll]] < level[rmq[dr - (1 << ll) + 1][ll]])
    return oi[rmq[st][ll]];
  else
    return oi[rmq[dr - (1 << ll) + 1][ll]];
}

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  fin >> n >> m;
  for (i = 2; i <= n; i++)
  {
    fin >> x;
    v[x].push_back(i);
  }
  dfs(1,0);
  for (i = 1; (1 << i) <= vf; i++)
    for (j = 1; j <= (vf - (1 << i))+1; j++)
    {
      rmq[j][i] = rmq[j][i - 1];
      if (level[rmq[j][i - 1]] > level[rmq[j + (1 << (i - 1))][i - 1]])
        rmq[j][i]=rmq[j + (1 << (i - 1))][i - 1];
    }
  for (i = 1; i <= m; i++)
  {
    fin >> x >> y;
    fr1 = fir[x];
    fr2 = fir[y];
    if (fr1 > fr2)
      swap(fr1, fr2);
    fout << rez(fr1, fr2)<<'\n';
  }
  return 0;
}