Cod sursa(job #1538575)

Utilizator BaweeLazar Vlad Bawee Data 29 noiembrie 2015 14:03:05
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
///O(SQRT(N))
#include <fstream>
#include <cmath>

using namespace std;

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

struct Nod
{
    int nod;
    Nod *urm;
};
typedef Nod *PNod;
PNod List[100001];

void add(int x,int y)
{
    PNod p = new Nod;
    p -> nod = y;
    p -> urm = List[x];
    List[x] = p;
}

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(PNod p = List[node]; p; p = p -> urm)
        dfs(p -> nod,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];

        add(T[i],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;
}