Cod sursa(job #1896531)

Utilizator ancabdBadiu Anca ancabd Data 28 februarie 2017 19:03:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>

using namespace std;

#define MAX_N 100005
#define MAX_L 20

#define foreach(V)

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

int n, m, t[MAX_L][MAX_N], lg[MAX_N], lv[MAX_N];
vector <int> g[MAX_N];

void dfs(int nod, int lev)
{
    lv[nod] = lev;

    vector<int>::iterator it;

    for(it = (g[nod]).begin(); it != (g[nod]).end(); it++)
        dfs(*it, lev+1);
}

int lca(int x, int y)
{
    if(lv[x] < lv[y])
        swap(x, y);

    int log1 = 1, log2 = 1;
    while((1 << log1) < lv[x]) log1++;
    while((1 << log2) < lv[y]) log2++;

    for(int k = log1; k >= 0; k--)
        if(lv[x] - (1 << k) >= lv[y])
            x = t[k][x];

    if(x == y) return x;

    for(int k = log2; k >= 0; k--)
        if(t[k][x] && t[k][x] != t[k][y])x = t[k][x],y = t[k][y];

    return t[0][x];
}

int main()
{
    fin >> n >> m;

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

    for(int k = 1; (1 << k) <= n; k++)
        for(int i = 1; i <= n; i++)
            t[k][i] = t[k-1][t[k-1][i]];

    dfs(1, 0);

    int x, y;

    for (int i = 1; i <= m; i ++)
    {
        fin >> x >> y;
        fout << lca(x, y) << "\n";
    }
}