Cod sursa(job #3306439)

Utilizator calinarulMarinescu Calin calinarul Data 10 august 2025 15:39:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX = 1e5 + 5;
vector<int> adj[NMAX];
vector<int>first(NMAX);
vector<pair<int,int>>euler;
vector<int>lg(2*NMAX);
pair<int,int> rmq[2*NMAX][20];

void dfs(int nod,int parinte,int nivel)
{
    first[nod]=euler.size();
    euler.push_back({nivel,nod});
    for(int i:adj[nod])
    {
        if(parinte!=i)
        {
            dfs(i,nod,nivel+1);
            euler.push_back({nivel,nod});
        }
    }
}
void build_rmq()
{
    int nrmq=euler.size();
    lg[1]=0;
    for(int i=2;i<=euler.size();i++)lg[i]=lg[i/2]+1;
    for(int i=0;i<euler.size();i++)rmq[i][0]=euler[i];
    for(int j=1;(1<<j)<=nrmq;j++)
    {
        for(int i=0;i+(1<<j)<=nrmq;i++)
        {
            rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
        }
    }
}
int query(int x,int y)
{
    x=first[x];
    y=first[y];
    if(x>y)swap(x,y);
    int len=y-x+1;
    int p=lg[len];
    return min(rmq[x][p],rmq[y-(1<<p)+1][p]).second;
}
int main()
{
    int n, m;
    fin >> n >> m;
    for (int i = 2; i <= n; i++)
    {
        int x;
        fin >> x;
        adj[x].push_back(i);
        adj[i].push_back(x);
    }
    dfs(1, 0,0);
    build_rmq();
    while(m--)
    {
        int st,dr;
        fin>>st>>dr;
        fout<<query(st,dr)<<'\n';
    }
}