Cod sursa(job #1805797)

Utilizator teo.cons98Constantin Teodor-Claudiu teo.cons98 Data 14 noiembrie 2016 14:11:12
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int n, m;

int tata[100001], tatasqrt[100001], radn, a, b, inaltime[100001];

void citire()
{
    int k, x, n1;
    fin>>n>>m;
    n1 = n;
    while(n1)
    {
        n1 /= 2;
        a++;
    }
    radn = sqrt(a);
    for(int i = 2; i <= n; ++i)
    {
        fin>>tata[i];
    }
    for(int i = 1; i <= radn + 2; ++i)
    {
        for(int j = 2; j <= n; ++j)
        {
            inaltime[j] = inaltime[tata[j]] + 1;
        }
    }
    for(int i = 2; i <= n; ++i)
    {
        k = tata[i];
        x = 1;
        while(tata[k] != 0 and x < radn)
        {
            k = tata[k];
            ++x;
        }
        tatasqrt[i] = k;
    }

}

void parcurgere()
{
    int inala = inaltime[a], inalb = inaltime[b];
    if(inalb < inala)
    {
        swap(inalb, inala);
        swap(a, b);
    }
    if(inala < inalb)
    {
        while((inalb - inala) >= radn)
        {
            b = tatasqrt[b];
            inalb -= radn;
        }
        while(inalb - inala)
        {
            b = tata[b];
            --inalb;
        }
    }
    while(tatasqrt[a] != tatasqrt[b])
    {
        a = tatasqrt[a];
        b = tatasqrt[b];
    }
    while(a != b)
    {
        a = tata[a];
        b = tata[b];
    }
    fout<<a<<'\n';
}

int main()
{
    citire();
    for(int i = 1; i <= m; ++i)
    {
        fin>>a>>b;
        parcurgere();
    }
}