Cod sursa(job #1376374)

Utilizator radarobertRada Robert Gabriel radarobert Data 5 martie 2015 17:13:20
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>

using namespace std;

const int MAXN = 100002;

vector<int> g[MAXN];
int lev[MAXN];
int t[MAXN], t2[MAXN];
int h = 0;

void dfs(int node, int level)
{
    lev[node] = level;
    if (level > h)
        h = level;
    for (unsigned i = 0; i < g[node].size(); i++)
        dfs(g[node][i], level+1);
}

void df(int node, int n1, int level)
{
    t2[node] = n1;
    if (level % h == 0)
        n1 = node;
    for (unsigned i = 0; i < g[node].size(); i++)
        df(g[node][i], n1, level+1);
}

int lca(int x, int y)
{
    while (t2[x] != t2[y])
        if (lev[x] > lev[y])
            x = t2[x];
        else
            y = t2[y];
    while (x != y)
        if (lev[x] > lev[y])
            x = t[x];
        else
            y = t[y];
    return x;
}

int main()
{
    ifstream in("lca.in");
    ofstream out("lca.out");

    int n, m;
    in >> n >> m;
    for (int i = 2; i <= n; i++)
    {
        in >> t[i];
        g[t[i]].push_back(i);
    }

    dfs(1, 0);
    df(1, 0, 0);

    int x, y;
    while (m--)
    {
        in >> x >> y;
        out << lca(x, y) << '\n';
    }

    return 0;
}