Cod sursa(job #1751956)

Utilizator ghost24ghost ghost ghost24 Data 2 septembrie 2016 14:06:55
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<iostream>
#include<fstream>
#include<vector>
#define DX 100100
using namespace std;
fstream fin("lca.in",ios::in),fout("lca.out",ios::out);
typedef vector<int> VI;
VI v[DX],st;
int n,N,m,ates[DX],log[2*DX],bst[2*DX][20];
void citire();
void dfs(int nod,int tata);
void rmq();
int lca(int x,int y);

int main()
{
    int i,x,y;
    citire();
    dfs(1,0);
    rmq();
    for(i=2;i<=N;i++) log[i]=log[i/2]+1;

    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<lca(x,y)<<"\n";
    }
}
int lca(int x,int y)
{
    int a=ates[x],b=ates[y],dist,lg;
    if(a>b) swap(a,b);
    dist=b-a+1;
    lg=log[dist];
    //cout<<a<<" "<<b<<" "<<dist<<" "<<lg<<" "<<"bst1: "<<bst[a][lg]<<" intre "<<a<<";"<<lg<<" bst2:"<<bst[b-lg+1][lg]<<"intre: "<<b-lg+1<<";"<<lg<<"\n";
    return min(bst[a][lg],bst[b-(1<<lg)+1][lg]);
}

void rmq()
{
    int i,j;
    for(j=0;(1<<j)<=N;j++)
    {
        for(i=0;i+(1<<j)<=N;i++)
        {

            if(j==0)
                bst[i][j]=st[i];
            else
                bst[i][j]=min(bst[i][j-1],bst[i+(1<<(j-1))][j-1]);
        }
    }
}

void dfs(int nod,int tata)
{
    int i,f;
    ates[nod]=st.size();
    st.push_back(nod);
    for(i=0;i<v[nod].size();i++)
    {
        f=v[nod][i];
        if(f!=tata)
        {
            dfs(f,nod);
            st.push_back(nod);
        }
    }
}
void citire()
{
    fin>>n>>m;
    N=2*n-1;
    int x,i;
    for(i=1;i<n;i++)
    {
        fin>>x;
        v[x].push_back(i+1);
    }
}