Cod sursa(job #2079390)

Utilizator patcasrarespatcas rares danut patcasrares Data 1 decembrie 2017 11:51:56
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#define DN 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,p,q,x[DN],aux,d;
int pr[21][DN];
vector<int>v[DN];
void dfs(int nod,int nr)
{
    x[nod]=nr;
    for(auto i:v[nod])
        dfs(i,nr+1);
}
int lc(int a,int b)
{
    if(x[b]>x[a])
    {
        aux=a;
        a=b;
        b=aux;
    }
    d=x[a]-x[b];
    for(int i=20;i>=0&&d;i--)
        if((1<<i)<=d)
        {
            a=pr[i][a];
            d-=(1<<i);
        }
    if(a==b)
        return a;
    for(int i=20;i>=0;i--)
        if(pr[i][a]!=pr[i][b]&&pr[i][a])
        {
            a=pr[i][a];
            b=pr[i][b];
        }
    return pr[0][a];
}
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        fin>>pr[0][i];
        v[pr[0][i]].push_back(i);
    }
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i<=n;i++)
            pr[j][i]=pr[j-1][pr[j-1][i]];
    dfs(1,1);
    for(int i=1;i<=m;i++)
    {
        fin>>p>>q;
        fout<<lc(p,q)<<'\n';
    }

}