Cod sursa(job #2605514)

Utilizator AndreeaGherghescuAndreea Gherghescu AndreeaGherghescu Data 25 aprilie 2020 12:34:20
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int L=17;
const int N=100002;

int lst[N],urm[2*N],nr,vf[2*N],ti[N],to[N],timp;
int t[L][N];

void adauga (int x, int y)
{
    vf[++nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}
void dfs (int nod)
{
    ti[nod]=++timp;
    for (int p=lst[nod];p!=0;p=urm[p])
    {
        int y=vf[p];
        if (ti[y]==0)
        {
            dfs(y);
            //t[0][y]=nod;
        }
    }
    to[nod]=++timp;
}
int lca (int x, int y)
{
    if (ti[x]<=ti[y] && to[y]<=to[x])
        return x;
    int pas=L-1;
    while (pas>=0)
    {
        int s=t[pas][x];
        if (s != 0 && (ti[s]>ti[y] || to[y]>to[s]))
            x=s;
        pas--;
    }
    return t[0][x];
}
int main()
{
    int n,m,x,y;
    in>>n>>m;
    for (int i=1;i<n;i++)
    {
        in>>x;
        t[0][i+1]=x;
        //adauga (i+1,x);
        adauga (x,i+1);
    }
    dfs (1);
    for (int i=1;(1<<i)<=n;i++)
    {
        for (int j=1;j<=n;j++)
        {
            t[i][j]=t[i-1][t[i-1][j]];
            out << t[i][j] << " ";
        }
        out << "\n";
    }
    for (int i=1;i<=m;i++)
    {
        in>>x>>y;
        out<<lca (x,y)<<'\n';
    }

    return 0;
}