Cod sursa(job #2165148)

Utilizator cicero23catalin viorel cicero23 Data 13 martie 2018 11:18:05
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define Nmax 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[Nmax];
int dfp[4*Nmax],niv[4*Nmax],m[Nmax][21],k,poz[Nmax];
void df(int x,int lev)
{
     niv[++k]=lev;
     dfp[k]=x;
     //if(poz[x]==0) poz[x]=k;
     int i;
     for(i=0;i<v[x].size();i++)
        if(!poz[v[x][i]])
        {
            poz[v[x][i]]=k+1;
            df(v[x][i],lev+1);
            niv[++k]=lev;
            dfp[k]=x;
        }
}
int main()
{
    int q,i,j,x,y,n;
    f>>n>>q;
    for(i=1;i<n;i++)
    {
        f>>x;
        v[x].push_back(i+1);
        v[i+1].push_back(x);
    }
    poz[1]=1;
    df(1,0);

    for(i=1;i<=k;i++)
        m[i][0]=i;
     for(j=1;(1<<j)<=k;j++)
        for(i=1;i+(1<<j)-1<=k;i++)
         {
            if(niv[m[i][j-1]]>niv[m[i+(1<<(j-1))][j-1]]) m[i][j]=m[i+(1<<(j-1))][j-1];
            else m[i][j]=m[i][j-1];
         }
         int l;
    for(i=1;i<=q;i++)
    {
        f>>x>>y;
        x=poz[x];
        y=poz[y];
        if(x>y) {l=x;x=y;y=l;}
        //cout<<x<<" "<<y<<'\n';
        l=log2(y-x+1);
        if(niv[m[x][l]]<=niv[m[y-(1<<l)+1][l]])g<<dfp[m[x][l]]<<'\n';
        else g<<dfp[m[y-(1<<l)+1][l]]<<'\n';
    }
    return 0;
}