Cod sursa(job #1411645)

Utilizator 4ONI2015oni2015 4ONI2015 Data 31 martie 2015 20:59:33
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define N 100005
#define pb push_back

using namespace std;

int rmq[18][1 << 18], niv[N], apar[N], cnt, n, m, i, x, y, a[N], j, nn, lv;
vector<int>v[N];

void df(int nod, int tata)
{
    niv[nod] = niv[tata] + 1;
    rmq[0][++cnt] = nod;
    apar[nod] = cnt;
    for(auto it : v[nod])
    {
        df(it, nod);
        rmq[0][++cnt] = nod;
    }
}
int main()
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 2; i <= n; i++)
    {
        scanf("%d", &x);
        v[x].pb(i);
    }
    df(1, 0);
    for(i = 2; i <= cnt; i <<= 1)
        a[i] = 1;
    for(i = 2; i <= cnt; i++)
        a[i] += a[i - 1];
    nn = a[cnt];
    for(i = 1; i <= nn; i++)
        for(j = 1; j <= cnt - (1 << i) + 1; j++)
            rmq[i][j] = niv[rmq[i - 1][j]] < niv[rmq[i - 1][j + (1 << (i - 1))]] ? rmq[i - 1][j] : rmq[i - 1][j + (1 << (i - 1))];
    for(; m; m--)
    {
        scanf("%d%d", &x, &y);
        if(apar[x] > apar[y])
            swap(x, y);
        x = apar[x];
        y = apar[y];
        lv = a[y - x + 1];
        niv[rmq[lv][x]] < niv[rmq[lv][y - (1 << lv) + 1]] ? printf("%d\n",rmq[lv][x]) : printf("%d\n",rmq[lv][y - (1 << lv) + 1]);
    }
    return 0;
}