Cod sursa(job #1399139)

Utilizator radarobertRada Robert Gabriel radarobert Data 24 martie 2015 16:27:04
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <vector>
#include <cmath>

using namespace std;

vector<int> g[100002];
int pos[100002], tour[200002][20], level[200002];
int k = 0;

void add(int node, int lv)
{
    tour[++k][0] = node;
    level[node] = lv;
    if (!pos[node])
        pos[node] = k;
}

void dfs(int node, int lv)
{
    add(node, lv);
    for (int i = 0; i < g[node].size(); i++)
    {
        dfs(g[node][i], lv+1);
        add(node, lv);
    }
}

inline int minLv(int a, int b)
{
    if (level[a] < level[b])
        return a;
    return b;
}

int main()
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);

    int n, m;
    scanf("%d%d", &n, &m);

    for (int x, i = 2; i <= n; i++)
    {
        scanf("%d", &x);
        g[x].push_back(i);
    }

    dfs(1, 0);

    for (int j = 1; j <= log2(k); j++)
        for (int i = 1; i <= k+1 - (1<<j); i++)
            tour[i][j] = minLv(tour[i][j-1], tour[i + (1<<(j-1))][j-1]);

    for (int x, y, l; m; m--)
    {
        scanf("%d%d", &x, &y);
        int a = pos[x];
        int b = pos[y];
        if (a > b)
        {
            int t = a;
            a = b;
            b = t;
        }
        l = log2(b-a+1);
        printf("%d\n", minLv(tour[a][l], tour[b+1-(1<<l)][l]));
    }

    return 0;
}