Cod sursa(job #2374294)

Utilizator ianiIani Biro iani Data 7 martie 2019 17:50:55
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>

#define NMAX 100005
#define INF 2000000000

using namespace std;

struct elem
{
    int val,niv;
    
    bool operator <(const elem& x2) const
    {
        return niv<x2.niv;
    }
} d[20][NMAX];

struct nod
{
    int fiu;
    nod* next;
}*a[NMAX];

int n,neuler,first[NMAX];

void dfs(int x,int niv)
{
    d[0][++neuler].val=x;
    d[0][neuler].niv=niv;
    first[x]=neuler;
    for (nod *i=a[x]; i; i=i->next)
    {
        dfs(i->fiu,niv+1);
        d[0][++neuler].val=x;
        d[0][neuler].niv=niv;
    }
}

int main()
{
    ifstream fin ("lca.in");
    ofstream fout ("lca.out");
    int m;
    fin>>n>>m;
    for(int i=1; i<n; i++)
    {
        int x;
        fin>>x;
        nod* nou=new nod;
        nou->fiu=i+1;
        nou->next=a[x];
        a[x]=nou;
    }
    dfs(1,0);
    for (int i=1;(1<<i)<=neuler;i++)
        for (int j=1;j<=neuler-(1<<i)+1;j++)
            d[i][j]=min(d[i-1][j],d[i-1][j+(1<<(i-1))]);
    for (int i=1; i<=m; i++)
    {
        int x,y,k;
        fin>>x>>y;
        x=first[x];
        y=first[y];
        if (y<x)
        {
            int aux=x;
            x=y;
            y=aux;
        }
        for (k=1;(1<<k)<=y-x;k++);
        k--;
        if (d[k][x].niv<d[k][y-(1<<k)+1].niv)
            fout<<d[k][x].val<<'\n';
        else
            fout<<d[k][y-(1<<k)+1].val<<'\n';
    }
    return 0;
}