Cod sursa(job #3122576)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 19 aprilie 2023 17:44:34
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include<bits/stdc++.h>
using namespace std;
ifstream F("lca.in");
ofstream G("lca.out");
vector<int> v[100000];
int n,i,t[100000],l[100000],q[100000],a[100000][17],p,u,j,k;
int main()
{
    for(F>>n>>i,i=1;i<n;F>>t[i],v[--t[i]].push_back(i),++i);
    for(l[0]=u=1;p<u;++p)
        for(int j:v[q[p]])
            if(!l[j])
                l[j]=l[q[p]]+1,q[u++]=j;
    for(i=0;i<n;++i)
        for(j=0;1<<j<n;a[i][j++]=-1);
    for(i=0;i<n;a[i][0]=t[i],++i);
    for(j=1;1<<j<n;++j)
        for(i=0;i<n;++i)
            if(a[i][j-1]!=-1)
                a[i][j]=a[a[i][j-1]][j-1];
    for(;F>>i>>j;) {
        if(--i,--j,l[i]<l[j])
            k=i,i=j,j=k;
        for(p=1;(1<<p)<=l[i];++p);
        for(k=--p;k>=0;--k)
            if(l[i]-(1<<k)>=l[j])
                i=a[i][k];
        if(i==j)
            G<<i+1<<'\n';
        else {
            for(k=p;k>=0;--k)
                if(a[i][k]!=-1&&a[i][k]!=a[j][k])
                    i=a[i][k],j=a[j][k];
            G<<1+t[i]<<'\n';
        }
    }
    return 0;
}