Cod sursa(job #2889244)

Utilizator StefanSVStefan S V StefanSV Data 12 aprilie 2022 15:12:31
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <queue>
#include <iostream>

using namespace std;

ifstream in("lca.in");
ofstream out("lca.out");

int n,niv[100001],mat[100001][15];

int main()
{
    int m;
    in>>n>>m;
    for(int i=2 ; i<=n ; i++)
    {
        in>>mat[0][i];
        niv[i]=niv[mat[0][i]]+1;
    }
    //construim matrice cu 2^i
    for(int j=1 ; j<=n ; j++)
    {
        for(int i=1 ; (1<<i)<=n ; i++)
        {
            mat[i][j]=mat[i-1][j];
            int ii=i;
            while(ii)
            {
                mat[i][j]=mat[0][mat[i][j]];
                ii--;
            }
        }
    }
    while(m)
    {
        int a,b;
        in>>a>>b;
        if(niv[a]>niv[b]) //a e jos
            swap(a,b);
        int i=0;
        while((1<<i+1)<=niv[b]-niv[a])
            i++;
        b=mat[i][b];
        while(a!=b)
        {
            if(niv[a]>niv[b])
                a=mat[0][a];
            else b=mat[0][b];
        }
        out<<a<<"\n";
        m--;
    }
    return 0;
}