Cod sursa(job #2683990)

Utilizator Gheorghita_VladGheorghita Vlad Gheorghita_Vlad Data 12 decembrie 2020 12:39:12
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int h[400005],d[400005][20],n,m,k,euler[400005],x,poz[400005],y,mn,lg;
vector<int>v[100005];
void dfs(int nod,int nivel)
{
    k++;
    h[k]=nivel;
    euler[k]=nod;
    if(poz[nod]==0) poz[nod]=k;
    for(int i=0; i<v[nod].size(); i++)
    {
        dfs(v[nod][i],nivel+1);
        k++;
        h[k]=nivel;
        euler[k]=nod;
    }
}
int main()
{
    int i,j;
    f>>n>>m;
    for(i=2; i<=n; i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    dfs(1,0);
    for(i=1; i<=k; i++)
        d[i][0]=i;
    for(j=1; (1<<j)<=k; j++)
        for(i=1; i<=k; i++)
        {
            if(h[d[i][j-1]]<h[d[i+(1<<(j-1))][j-1]])
                d[i][j]=d[i][j-1];
            else d[i][j]=d[i+(1<<(j-1))][j-1];
        }
    for(i=1; i<=m; i++)
    {
        f>>x>>y;
        x=poz[x];
        y=poz[y];
        if(x>y) swap(x,y);
        lg=log2(y-x+1);
        if(h[d[x][lg]]<h[d[y-(1<<lg)+1][lg]])
            mn=d[x][lg];
        else mn=d[y-(1<<lg)+1][lg];
        g<<euler[mn]<<'\n';
    }
    return 0;
}