Cod sursa(job #2019920)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 8 septembrie 2017 20:30:19
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,k;
vector <int> a[100001];
int e[200001],niv[200001],ap[200001],d[20][200001],lg[200001];
void euler(int nod,int nivel)
{
    int i;
    k++;
    e[k]=nod;
    niv[k]=nivel;
    ap[nod]=k;
    for(i=0;i<a[nod].size();i++)
    {
        euler(a[nod][i],nivel+1);
        k++;
        e[k]=nod;
        niv[k]=nivel;
    }

}
int main()
{
    int i,x,j,y,p,q,aux,l,sol;
    f>>n>>m;
    for(i=1;i<=n-1;i++)
    {
        f>>x;
        a[x].push_back(i+1);
    }
    euler(1,1);
    lg[1]=0;
    for(i=2;i<=k;i++)
    {
        lg[i]=1+lg[i/2];
    }
    for(i=1;i<=k;i++)
    {
        d[0][i]=i;
    }
    for(i=1;i<=lg[k];i++)
    {
        for(j=1;j<=k-(1<<i);j++)
        {
            d[i][j]=d[i-1][j];
            if(niv[d[i][j]]>niv[d[i-1][j+(1<<(i-1))]])
            {
                d[i][j]=d[i-1][j+(1<<(i-1))];
            }
        }
    }
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        p=ap[x];
        q=ap[y];
        if(p>q)
        {
            aux=p;
            p=q;
            q=aux;
        }
        l=lg[q-p+1];
        sol=d[l][p];
        if(niv[sol]>niv[d[l][q-(1<<l)+1]])
        {
            sol=d[l][q-(1<<l)+1];
        }
        g<<e[sol]<<"\n";
    }
    return 0;
}