Cod sursa(job #2084703)

Utilizator patcasrarespatcas rares danut patcasrares Data 9 decembrie 2017 11:35:40
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<cmath>
#include<iostream>
#define DN 100005
#include<vector>
#define pb push_back
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,pr[DN],pr2[DN],t,niv[DN],l,a,b,aux,bl[DN],nr;
vector<int>v[DN];
void dfs(int nod,int l)
{
    for(auto i:v[nod])
        if(niv[i]==0)
        {
            niv[i]=(niv[nod]+1);
            if(niv[i]%t==1)
            {
                pr2[i]=pr2[pr[i]];
                bl[i]=niv[i]/t-1;
                dfs(i,nod);
            }
            else
            {
                pr2[i]=l;
                bl[i]=niv[i]/t;
                bl[i]=nr;
                dfs(i,l);
            }

        }
}
int ve()
{
    if(niv[b]>niv[a])
    {
        aux=a;
        a=b;
        b=aux;
    }
    while(bl[a]!=bl[b])
        if(niv[a]>niv[b])
            a=pr2[a];
        else
            b=pr2[b];
    if(a==b)
        return a;
    while(a!=b)
        if(niv[a]>niv[b])
            a=pr[a];
        else
            b=pr[b];
    return a;
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<n;i++)
    {
        fin>>pr[i+1];
        v[pr[i+1]].pb(i+1);
    }
    t=sqrt(n);
    niv[1]=1;
    dfs(1,1);
    for(int i=1;i<=m;i++)
    {
        fin>>a>>b;
        fout<<ve()<<'\n';
    }
}