Cod sursa(job #2607285)

Utilizator rares9991Matisan Rares-Stefan rares9991 Data 29 aprilie 2020 16:12:27
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#define L 17
using namespace std;

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

const int N=100001;
const int M=2*N;
const int P=2000001;

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

int n, m;

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);
            t[0][y]=x;
        }
    }
    to[x]=++timp;
}

int lca(int x, int y)
{
    if(ti[x]<=ti[y] and to[x]<=to[y])
        return x;
    int pas=L-1;
    while(pas>=0)
    {
        int s=t[pas][x];
        if(s!=0 and (ti[s]>ti[y] or to[y]>to[s]))
            x=s;
        pas--;
    }
    return t[0][x];
}

int main()
{
    in>>n>>m;
    for(int i=1; i<n; i++)
    {
        int x;
        in>>x;
        adauga(i+1,x);
        adauga(x,i+1);
    }
    //t[i][j]= al 2^i-lea stramos al lui j;
    for(int i=1; i<L; i++)
        for(int j=1; j<=n; j++)
    {
        t[i][j]=t[i-1][t[i-1][j]];
    }
    dfs(1);
    while(m)
    {
        m--;
        int a,b;
        in>>a>>b;
        out<<lca(a,b)<<"\n";
    }
    return 0;
}