Cod sursa(job #1548261)

Utilizator BaweeLazar Vlad Bawee Data 10 decembrie 2015 18:30:13
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <cmath>
#include <vector>

using namespace std;

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

vector <int> G[100001];
int P[100001],H[100001],T[100001];
int n,m;

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

    while(x != y)
        if(H[x] > H[y]) x = T[x];
        else            y = T[y];

    return x;
}

void dfs(int node, int split)
{
    if(H[node] < split) P[node] = 1;
    else
        if(H[node] % split == 0) P[node] = T[node];
        else                  P[node] = P[T[node]];

    for(vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)
        dfs(*it,split);
}

int main()
{
    int x,y,HMax = 0;

    f >> n >> m;

    H[1] = 0;
    for(int i = 2; i <= n; ++i)
    {
        f >> T[i];
        G[T[i]].push_back(i);
        H[i] = H[T[i]] + 1;
        if(H[i] > HMax) HMax = H[i];
    }

    int split = sqrt(HMax);

    dfs(1,split);

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

    return 0;
}