Cod sursa(job #3344182)

Utilizator andrei1232008nicolae andrei andrei1232008 Data 1 martie 2026 16:20:22
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

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

const int lim=1e5+10;
int n,Q,i,m,d[lim],first[lim],aint[16*lim];
vector <int> v[lim];
vector <int> e;
void euler(int k)
{
    e.push_back(k);
    for(auto x:v[k])
    {
        d[x]=d[k]+1;
        euler(x);
        e.push_back(k);
    }
}
int query(int l,int r)
{
    l+=m;r+=m;
    int ans=0,mn=1e9;
    while(l<=r)
    {
        if(l%2)
        {
            if(mn>d[aint[l]])
            {
                mn=d[aint[l]];
                ans=aint[l];
            }
        }
        if(!(r%2))
        {
            if(mn>d[aint[r]])
            {
                mn=d[aint[r]];
                ans=aint[r];
            }
        }
        l=(l+1)/2;
        r=(r-1)/2;
    }
    return ans;
}
int main()
{
    fin>>n>>Q;
    for(i=2;i<=n;i++)
    {
        int x;
        fin>>x;
        v[x].push_back(i);
    }
    euler(1);
    for(i=1;i<=n;i++)
        first[i]=-1;
    m=e.size();
    for(auto x=0;x<m;x++)
    {
        if(first[e[x]]==-1)first[e[x]]=x;
    }
    for(i=0;i<m;i++)
        aint[i+m]=e[i];
    for(i=m-1;i>0;i--)
    {
        if(d[aint[2*i]]<d[aint[2*i+1]])
            aint[i]=aint[2*i];
        else aint[i]=aint[2*i+1];
    }
    while(Q--)
    {
        int l,r;
        fin>>l>>r;
        l=first[l];
        r=first[r];
        if(l>r)swap(l,r);
        fout<<query(l,r)<<'\n';
    }
    return 0;
}