Cod sursa(job #3143666)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 1 august 2023 12:11:13
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include<bits/stdc++.h>
using namespace std;
ifstream F("lca.in");
ofstream G("lca.out");
int n,m,i,j,k,r,t[100001],p[18][100001],l[100001];
bitset<100001> b;
vector<int> v[100001];
queue<int> q;
int main()
{
    for(F>>n>>m,i=2;i<=n;F>>j,v[j].push_back(i),t[i++]=j);
    for(q.push(1);!q.empty();q.pop())
        for(i=q.front(),k=v[i].size(),j=0;j<k;++j)
            if(v[i][j]>1&&!l[v[i][j]])
                l[v[i][j]]=l[i]+1,q.push(v[i][j]);
    for(j=0;1<<j<=n;++j)
        for(i=1;i<=n;p[j][i++]=-1);
    for(i=1;i<=n;p[0][i]=t[i],++i);
    for(j=1;1<<j<=n;++j)
        for(i=1;i<=n;++i)
            if(p[j-1][i]!=-1)
                p[j][i]=p[j-1][p[j-1][i]];
    for(;m--;) {
        if(F>>i>>j,l[i]<l[j])
            swap(i,j);
        for(r=1;1<<r<=l[i];++r);
        for(k=--r;k>=0;--k)
            if(l[i]-(1<<k)>=l[j])
                i=p[k][i];
        if(i==j)
            G<<i<<'\n';
        else {
            for(k=r;k>=0;--k)
                if(p[k][i]!=-1&&p[k][i]!=p[k][j])
                    i=p[k][i],j=p[k][j];
            G<<t[i]<<'\n';
        }
    }
    return 0;
}