Cod sursa(job #2605519)

Utilizator DanSDan Teodor Savastre DanS Data 25 aprilie 2020 12:40:32
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 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, t[L][N];

void adauga (int x, int y)
{
    vf[++nr]=y;
    urm[nr]=lst[x];
    lst[x]=nr;
}

void dfs(int x)
{
    ti[x] = ++timp;
    for(int p = lst[x]; p != 0; p = urm[p])
    {
        int y = vf[p];
        if(ti[y] == 0)
            dfs(y);
    }
    to[x] = ++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 (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]];
        }
    }
    for (int i=1;i<=m;i++)
    {
        in>>x>>y;
        out<<lca (x,y)<<'\n';
    }

    return 0;
}