Cod sursa(job #3296516)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 13 mai 2025 08:43:25
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int N=1e5;
vector<int> b[N];
int a[N][17],c[N],d[N],e[N];
int main()
{
    int m,n;
    cin>>n>>m,e[0]=1;
    for(int i=1;i<n;cin>>c[i],b[--c[i]].push_back(i),++i);
    for(int i=0,j=1;i<j;++i)
        for(int k:b[d[i]])
            if(!e[k])
                e[k]=e[d[i]]+1,d[j++]=k;
    for(int i=0;i<n;++i)
        for(int j=0;1<<j<n;a[i][j++]=-1);
    for(int i=0;i<n;a[i][0]=c[i],++i);
    for(int j=1;1<<j<n;++j)
        for(int i=0;i<n;++i)
            if(a[i][j-1]!=-1)
                a[i][j]=a[a[i][j-1]][j-1];
    for(;m--;) {
        int i,j,l;
        if(cin>>i>>j,--i,--j,e[i]<e[j])
            swap(i,j);
        for(l=1;1<<l<=e[i];++l);
        for(int k=--l;k>=0;--k)
            if(e[i]-e[j]>=1<<k)
                i=a[i][k];
        if(i==j)
            cout<<i+1<<'\n';
        else {
            for(int k=l;k>=0;--k)
                if(a[i][k]!=-1&&a[i][k]!=a[j][k])
                    i=a[i][k],j=a[j][k];
            cout<<1+c[i]<<'\n';
        }
    }
    return 0;
}