Cod sursa(job #3280807)

Utilizator GILIEDAVIDGilie David Florin GILIEDAVID Data 27 februarie 2025 16:00:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> v[100005];
int n,m,i,j,k,d[200005][20],poz[100005],e[200005][20],x,p,y;
void dfs(int nod,int h)
{
    d[++k][0]=h;
    if(!poz[nod])
        poz[nod]=k;
    e[k][0]=nod;
    for(int i=0;i<v[nod].size();i++)
    {
        dfs(v[nod][i],h+1);
        d[++k][0]=h;
        e[k][0]=nod;
    }
}
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    dfs(1,1);
    for(j=1;(1<<j)<=k;j++)
        for(i=1;i+(1<<j)-1<=k;i++)
            {
                if(d[i][j-1]<d[i+(1<<(j-1))][j-1])
                {
                    d[i][j]=d[i][j-1];
                    e[i][j]=e[i][j-1];
                }
                else
                {
                    d[i][j]=d[i+(1<<(j-1))][j-1];
                    e[i][j]=e[i+(1<<(j-1))][j-1];
                }
            }
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        int x1=poz[x];
        int y1=poz[y];
        if(x1>y1)
            swap(x1,y1);
        p=log2(y1-x1+1);
        if(d[x1][p]<d[y1-(1<<p)+1][p])
            g<<e[x1][p]<<'\n';
        else
            g<<e[y1-(1<<p)+1][p]<<'\n';
    }
    return 0;
}