Cod sursa(job #1538573)

Utilizator BaweeLazar Vlad Bawee Data 29 noiembrie 2015 13:53:49
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
///O(SQRT(N))
#include <fstream>
#include <cmath>

using namespace std;

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

int L[100001];
int T[100001];
int P[100001];
int H,N,Tst;

void dfs(int node,int nr)
{
    if(L[node] < nr)
        P[node] = 1;
    else
        if(!(L[node] % nr))
            P[node] = T[node];
        else
            P[node] = P[ T[node] ];

    for(int i = 1; i <= N; i++)
        if(T[i] == node)
            dfs(i,nr);
}

int LCA(int x,int y)
{
    while(P[x] != P[y])
    {
        if(L[x] > L[y])
            x = P[x];
        else
            y = P[y];
    }

    while(x != y)
    {
        if(L[x] > L[y])
            x = T[x];
        else
            y = T[y];
    }

    return x;
}

int main()
{
    int x,y;

    f >> N >> Tst;
    L[1] = 0;
    H = 0;
    for(int i = 2; i <= N; i++)
    {
        f >> T[i];
        L[i] = L[ T[i] ] + 1;
        if(L[i] > H)
            H = L[i];
    }

    int nr = sqrt(H);
    dfs(1,nr);

    for(int i = 1; i <= Tst; i++)
    {
        f >> x >> y;
        g << LCA(x,y) << "\n";
    }

    return 0;
}