Cod sursa(job #3329673)

Utilizator DasapSapunaru Daniel Dasap Data 14 decembrie 2025 21:31:28
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");ofstream fout("lca.out");
int n,m,i,grad[100005],first[100005],rmq[18][100005],sz,lg[100005],mx,p,x,y,a,b;vector<int>v[100005],euler;
void dfs(int nod,int tata){
    euler.push_back(nod);
    first[nod]=euler.size()-1;
    for(auto x:v[nod]){
        if(x==tata)continue;
        grad[x]=grad[nod]+1;
        dfs(x,nod);
        euler.push_back(nod);
    }
}
int main()
{
    fin>>n>>m;euler.push_back(0);
    for(i=2;i<=n;i++)lg[i]=lg[i/2]+1;
    mx=lg[n];
    for(i=2;i<=n;i++){
        fin>>x;
        v[i].push_back(x);
        v[x].push_back(i);
    }
    grad[1]=1;
    dfs(1,0);
    sz=euler.size()-1;
    for(i=1;i<=sz;i++)rmq[0][i]=euler[i];
    for(p=1;p<=mx;p++)
        for(i=1;i<=sz-(1<<p)+1;i++){
            if(grad[rmq[p-1][i]<grad[rmq[p-1][i+(1<<(p-1))]]])rmq[p][i]=rmq[p-1][i];
            else rmq[p][i]=rmq[p-1][i+(1<<(p-1))];
        }
    for(i=1;i<=m;i++){
        fin>>x>>y;
        x=first[x];
        y=first[y];
        if(y<x)swap(x,y);
        p=lg[y-x+1];
        a=rmq[p][x];
        b=rmq[p][y-(1<<p)+1];
        if(grad[a]>grad[b])fout<<b;
        else fout<<a;
        fout<<'\n';
    }
    return 0;
}