Cod sursa(job #1081113)

Utilizator CatalinaRaduCatalina Elena Radu CatalinaRadu Data 13 ianuarie 2014 10:12:37
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define N_max 100010
#define L_max 20

int n,m;
int Arb[L_max][N_max],Lg[N_max],Niv[N_max];
vector <int> A[N_max];

void read()
{
    f>>n>>m;
    for (int i=2;i<=n;i++)
    {
        f>>Arb[0][i];
        A[Arb[0][i]].push_back(i);
    }
    int k;
    for (k=1; (1<<k)<=n;++k)
       for (int i=1;i<=n;i++)
         Arb[k][i]=Arb[k-1][Arb[k-1][i]];
}
 void df(int nod, int niv)
 {
     Niv[nod]=niv;
     vector<int>::iterator it;
        for(it=A[nod].begin();it!=A[nod].end();++it)
       df(*it,niv+1);

 }

 int lca(int x, int y)
 {
     if (Niv[x]<Niv[y])
        swap(x,y);
     int log1, log2;
     for(log1=1;(1<<log1)<=Niv[x];++log1);
     for(log2=1;(1<<log2)<=Niv[y];++log2);

     for(int k=log1;k>=0;--k)
        if(Niv[x]-(1<<log1)>=Niv[y])
          x=Arb[k][x];
     if(x==y)
        return x;
     for (int k=log2;k>=0;--k)
        if(Arb[k][x] && Arb[k][x]!=Arb[k][y])
     {
         x=Arb[k][x];
         y=Arb[k][y];
     }
     return Arb[0][x];

 }
int main()
{
    read();
    df(1,0);
    while(m>0)
    {
        int a,b;
        f>>a>>b;
        g<<lca(a,b)<<'\n';
        m--;
    }
    f.close();
    g.close();
    return 0;
}