Cod sursa(job #2082687)

Utilizator daniela12Sandu Daniela Teodora daniela12 Data 6 decembrie 2017 18:02:28
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, v[100500], m, t[300000], j=1, nr, viz[100500], prima[100050], N[300000];
int rmq[50][200000],lg[200000], M;
void citire()
{
    f>>n>>m;
    int i;v[0]=1;
    for(i=1;i<n;++i)
        f>>v[i];
}
void dfs(int x, int nivel)
{
    int i;
    t[++M]=x;
    viz[x]=1;
    N[M]=nivel;
    for(i=x+1;i<=n;++i)
        if(!viz[i] && v[i-1]==x)
        {
            dfs(i, nivel+1);
            t[++M]=x;
            N[M]=nivel;
        }
}
void rmq1 ()
{
    int i, k, l;
    for (i=2;i<=M;++i)
        lg[i]=lg[i/2]+1;
    for (i=1;i<=M;++i)
        rmq[0][i]=t[i];
    for (i=1;(1<<i)<=M;++i)
       for (k=1;k<=M-(1<<i)+1;++k)
        {
            l=1<<(i-1);
            rmq[i][k]= min(rmq[i-1][k],rmq[i-1][k+l]);
        }
}
int main()
{
    citire();
    int i, diff,l, sh ;
    dfs(1,0);
    for(i=1;i<=M;++i)
        if(prima[t[i]]==0)  prima[t[i]]=i;
    rmq1();
    while(m--)
    {
        int x, y, mi;
        f>>x>>y;
        x=prima[x];
        y=prima[y];
        if(x>y)
            swap(x,y);
        diff=y-x+1;
        l=lg[diff];
        sh=y-(1<<l)+1;
        mi=min(rmq[l][x],rmq[l][sh]);
        g<<mi<<'\n';
    }
    g.close();
}