Cod sursa(job #2571484)

Utilizator mihaela.macarie01@yahoo.comMihaela Macarie [email protected] Data 4 martie 2020 23:56:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#define N 100005
#define L 20
using namespace std;

ifstream x("lca.in");
ofstream y("lca.out");

int k,n,m,*v[N],val;
int rmq[L][N << 2];
int x1,y1;
int l[N << 1],h[N << 1],lg[N << 1],first[N];

void citire()
{
    x>>n>>m;
    for(int i=1;i<=n;i++)
    {
        v[i]=(int *) realloc(v[i],sizeof(int));
        v[i][0]=0;
    }
    for(int i=2;i<=n;i++)
    {
        x>>val;
        v[val][0]++;
        v[val]=(int *) realloc(v[val],(v[val][0]+1)*sizeof(int));
        v[val][v[val][0]]=i;
    }
}

void dfs(int nod, int levi)
{
    h[++k]=nod;
    l[k]=levi;
    first[nod]=k;
    for(int i=1;i<=v[nod][0];i++)
    {
        dfs(v[nod][i],levi+1);
        h[++k]=nod;
        l[k]=levi;
    }
}

void Rmq()
{
    for(int i=2;i<=k;i++)
        lg[i]=lg[i >> 1]+1;
    for(int i=1;i<=k;i++)
        rmq[0][i]=i;
    for(int i=1;(1 << i)<k ;i++)
        for(int j=1;j<=k-(1 << i);j++)
        {
            int lng= 1 << (i-1);
            rmq[i][j]=rmq[i-1][j];
            if(l[rmq[i-1][j+lng]]<l[rmq[i][j]])
                rmq[i][j]=rmq[i-1][j+lng];
        }
}

int lca(int a, int b)
{
    int dif,lng,sol,sh;
    int st=first[a];
    int dr=first[b];
    if(st>dr)
        swap(st,dr);
    dif=dr-st+1;
    lng=lg[dif];
    sol=rmq[lng][st];
    sh=dif-(1 << lng);
    if(l[sol]>l[rmq[lng][st+sh]])
        sol=rmq[lng][st+sh];
    return h[sol];
}

int main()
{
    citire();
    dfs(1,0);
    Rmq();
    while(m--)
    {
        x>>x1>>y1;
        y<<lca(x1,y1)<<'\n';
    }
    x.close();
    y.close();
    return 0;
}