Cod sursa(job #2392525)

Utilizator darisavuSavu Daria darisavu Data 30 martie 2019 09:45:04
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int>v[100005];
int n,m,nr,d[500005][20],a,b,k,x,ad[500005],y;
long long p[100005],euler[500005];
void df(int o,int a)
{
    nr++;
    euler[nr]=o;
    if(p[o]==0) p[o]=nr;
    ad[nr]=a;
    for(int i=0;i<v[o].size();i++)
    {
        df(v[o][i],a+1);
        nr++;
        ad[nr]=a;
        euler[nr]=o;
        if(p[o]==0) p[o]=nr;
    }
}
int main()
{
    int i,j;
    f>>n>>m;
    for(i=1;i<n;i++)
    {
        f>>x;
        v[x].push_back(i+1);
    }
    df(1,0);
    for(i=1;i<=nr;i++) d[i][0]=euler[i];

     for(j=1;(1<<j)<=nr;j++)
        for(i=1;i+(1<<j)-1<=nr;i++)
    {
        if(ad[p[d[i][j-1]]]<ad[p[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;
        a=p[min(x,y)];
        b=p[max(x,y)];
        k=log2(b-a+1);
        if(ad[p[d[a][k]]]<ad[p[d[b-(1<<k)+1][k]]])  g<<d[a][k]<<'\n';
        else g<<d[b-(1<<k)+1][k]<<'\n';

    }
    return 0;
}