Cod sursa(job #1045628)

Utilizator sebinechitasebi nechita sebinechita Data 1 decembrie 2013 20:18:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
//nu ii frumos sa te uiti pe sursele altora:))...hotule....nu o sti face singur?:))
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define MAX 100010

vector <int> G[MAX];
int a[2*MAX], k, minim[2*MAX][20];
int fr[MAX],lvl[MAX];

void insert(int s)
{
    a[++k]=s;
}

void put(int s)
{
    int i;
    insert(s);
    for(i=0;i<G[s].size();i++)
        {
            put(G[s][i]);
            insert(s);
        }
}

void DF(int nod, int nivel)
{
    lvl[nod]=nivel;
    for(int i=0;i<G[nod].size();i++)
    {
        DF(G[nod][i], nivel+1);
    }
}

int main()
{
    int n, m, x, i, j, y;
    fin>>n;
    fin>>m;

    for(i=2;i<=n;i++)
    {
        fin>>x;
        G[x].push_back(i);
    }
    put(1);
    for(i=1;i<=k;i++)
    {
        if(!fr[a[i]])
            fr[a[i]]=i;
    }
    DF(1, 0);
    for(i=1;i<=k;i++)
        minim[i][0]=a[i];
    for(j=1;(1<<j)<=k;j++)
    {
        for(i=1;i+(1<<(j-1))<=k;i++)
        {
            //minim[i][j]=min(minim[i][j-1], minim[i+(1<<(j-1))][j-1]);
            if(lvl[minim[i][j-1]]<=lvl[minim[i+(1<<(j-1))][j-1]])
                minim[i][j]=minim[i][j-1];
            else
                minim[i][j]=minim[i+(1<<(j-1))][j-1];
        }
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        x=fr[x];
        y=fr[y];
        if(y<x)
            swap(x,y);
        k=log2(y-x+1);

        fout<<min(minim[x][k], minim[y-(1<<k)+1][k])<<"\n";
    }

}