Cod sursa(job #1883973)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 18 februarie 2017 12:54:40
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <vector>
#define BIT(x) (1<<(x))

using namespace std;

struct rec
{
    int vmin, pmin;
} v[300001][20];
vector<int> g[100001];
int pos[100001];
int lv, n, m;

int dfs(int nod, int nivel)
{
    pos[nod] = lv;
    v[lv][0].vmin = nivel;
    v[lv][0].pmin = nod;
    lv++;
    for(int i = 0; i < g[nod].size(); i++)
    {
        dfs(g[nod][i], nivel + 1);
        v[lv][0].vmin = nivel;
        v[lv][0].pmin = nod;
        lv++;
    }
}

int main()
{
    int i, a, b, j;
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 2; i <= n; i++)
    {
        scanf("%d", &a);
        g[a].push_back(i);
    }
    dfs(1, 0);
    for(j = 1; BIT(j) <= lv; j++)
    {
        for(i = 0; i <= lv - BIT(j - 1); i++)
        {
            if(v[i][j - 1].vmin < v[i + BIT(j - 1)][j - 1].vmin)
                v[i][j] = v[i][j - 1];
            else v[i][j] = v[i + BIT(j - 1)][j - 1];
        }
    }
    while(m--)
    {
        scanf("%d%d", &a, &b);
        a = pos[a];
        b = pos[b];
        if(a > b)
            swap(a, b);
        int dim, dif = b - a;
        for(dim = 19; BIT(dim) > dif; dim--);
        if(v[a][dim].vmin < v[b - BIT(dim) + 1][dim].vmin)
            printf("%d\n", v[a][dim].pmin);
        else printf("%d\n", v[b - BIT(dim) + 1][dim].pmin);
    }
    return 0;
}