Cod sursa(job #2285925)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 19 noiembrie 2018 15:35:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int> v[100001];
int nivel[100001],e[200001],poz[100001];
int log[4000001];
int rmq[23][200001];
int ne=0;
void dfs(int nod)
{
    e[++ne]=nod;
    poz[nod]=ne;
    for(int i=0; i<v[nod].size(); i++)
    {
        nivel[v[nod][i]]=nivel[nod]+1;
        dfs(v[nod][i]);
        e[++ne]=nod;
    }
}
int main()
{
    int n,k,i,x,j,a,b,y,l;
    in>>n>>k;
    for(i=2; i<=n; i++)
    {
        in>>x;
        v[x].push_back(i);
    }
    dfs(1);
    for(i=1; i<=ne; i++)
        rmq[0][i]=e[i];
    for(i=2; i<=ne; i++)
        log[i]=log[i/2]+1;
    for(i=1; i<=log[ne]; i++)
        for(j=(1<<i); j<=ne; j++)
        {
            rmq[i][j]=rmq[i-1][j];
            if(nivel[rmq[i][j]]>nivel[rmq[i-1][j-(1<<(i-1))]])
                rmq[i][j]=rmq[i-1][j-(1<<(i-1))];
        }
    for(i=1; i<=k; i++)
    {
        in>>a>>b;
        x=poz[b];
        y=poz[a];
        if(x<y)
            swap(x,y);
        l=log[x-y+1];
        out<<min(rmq[l][x],rmq[l][y+(1<<l)-1])<<'\n';
    }
    return 0;
}