Cod sursa(job #3122572)

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