Cod sursa(job #1708113)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 26 mai 2016 17:25:56
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

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

vector <int> v[100010];

int lev[100010], e[250010], poz[100010], p[25];

int n,i,k,m,x,j,a,b,d;

int rmq[20][250010];

void dfe(int x, int l)
{
    ++n;
    lev[n]=l;
    e[n]=x;
    poz[x]=n;

    for(int i=0; i<v[x].size(); ++i)
    {
        dfe(v[x][i],l+1);
        ++n;
        e[n]=x;
        lev[n]=l;
    }
}

inline int log(int x)
{
    int i=0;
    while(p[i+1]<x)
        ++i;
    return i;
}

int main()
{
    f>>n>>m;
    for(i=2; i<=n; ++i)
    {
        f>>x;
        v[x].push_back(i);
    }

    p[0]=1;
    for(i=1; i<20; ++i)
        p[i]=p[i-1]*2;

    n=0;
    dfe(1,0);

    for(i=1; i<=n; ++i)
        rmq[0][i]=i;

    k=log(n)+1;
    for(i=1; i<k; ++i)
    {
        for(j=1; j<=n; ++j)
        {
            if(lev[rmq[i-1][j+p[i-1]]]<lev[rmq[i-1][j]])
                rmq[i][j]=rmq[i-1][j+p[i-1]];
            else
                rmq[i][j]=rmq[i-1][j];
        }
    }

    for(i=1; i<=m; ++i)
    {
        f>>a>>b;
        a=poz[a];
        b=poz[b];
        if(a>b)
            swap(a,b);

        d=b-a+1;
        k=log(d);

        if(lev[rmq[k][a]]<lev[rmq[k][b-p[k]+1]])
                cout<<e[rmq[k][a]]<<'\n';
            else
                cout<<e[rmq[k][b-p[k]+1]]<<'\n';

        g<<e[a]<<'\n';
    }
}