Cod sursa(job #2565470)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 2 martie 2020 14:17:49
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,a,b,k,st[100010],dr[100010],l[400010],h,ne,leng;
pair<int,int> z[30][400010],aux;
vector<int> v[100010];
void dfs(int nod,int lvl)
{
    z[0][++k]={lvl,nod};st[nod]=k;
    for(auto it:v[nod])
    {
        dfs(it,lvl+1);
        z[0][++k]={lvl,nod};dr[nod]=k;
    }
}

int main()
{
    fin>>n>>m;
    for(i=1;i<n;i++)
    {
        fin>>a;
        v[a].push_back(i+1);
    }
    dfs(1,0);
    for(i=1;i<=k;i++) l[i]=l[i/2]+1;
    for(h=1;h<=l[k];h++)
    {
        for(i=1;i<=k;i++) if(i+(1<<h)-1<=k)
        {
            ne=i+(1<<(h-1));//fout<<ne<<"\n";
            if(z[h-1][i].first<z[h-1][ne].first)
                z[h][i]=z[h-1][i];
            else
                z[h][i]=z[h-1][ne];
        }
        else z[h][i]=z[h-1][i];
    }
    for(i=1;i<=m;i++)
    {
        fin>>a>>b;
        if(st[a]>st[b]) swap(a,b);
        leng=l[st[b]-st[a]]-1;
        aux=min(z[leng][st[a]],z[leng][st[b]-(1<<leng)+1]);
        fout<<aux.second<<"\n";
    }
    return 0;
}