Mai intai trebuie sa te autentifici.

Cod sursa(job #2948197)

Utilizator TraianQTraianQ TraianQ Data 27 noiembrie 2022 13:48:02
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>
using namespace std;
int A[18][100005],level[100005];
vector <int> V[100005];
void DFS(int k)
{
    for(auto x:V[k])
    {
        level[x]=level[k]+1;
        DFS(x);
    }
}
int val;
int sameA(int a,int b)
{
    if(level[a]<level[b])
        return 0;
    for(int exp=val;exp>=0;exp--)
    {
        if(level[a]-(1<<exp)>=level[b])
        {
            a=A[exp][a];
        }
    }
    if(a==b)
        return 1;
    return 0;
}
int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    int n,Q,a,b;
    fin>>n>>Q;
    val=log2(n);
    for(int i=2;i<=n;i++)
    {
        fin>>A[0][i];
        V[A[0][i]].push_back(i);
    }
    level[1]=1;
    DFS(1);
    for(int i=1;i<=val;i++)
        for(int j=1;j<=n;j++)
            A[i][j]=A[i-1][A[i-1][j]];
    for(int q=1;q<=Q;q++)
    {
        fin>>a>>b;
        if(a==b)
        {
            fout<<b<<"\n";
        }
        else if(sameA(a,b)==1)
        {
            fout<<b<<"\n";
        }
        else if(sameA(b,a)==1)
        {
            fout<<a<<"\n";
        }
        else
        {
            if(level[a]<level[b])
            {
                for(int exp=val;exp>=0;exp--)
                {
                    if(level[b]-(1<<exp)>=level[a])
                    {
                        b=A[exp][b];
                    }
                }
            }
            else if(level[a]>level[b])
            {
                for(int exp=val;exp>=0;exp--)
                {
                    if(level[a]-(1<<exp)>=level[b])
                    {
                        a=A[exp][a];
                    }
                }
            }
            if(level[a]==level[b])
            {
                for(int exp=val;exp>=0;exp--)
                {
                    if(A[exp][a]!=A[exp][b])
                    {
                        a=A[exp][a];
                        b=A[exp][b];
                    }
                }
                fout<<A[0][a]<<'\n';
            }
        }
    }
    return 0;
}