Cod sursa(job #1758203)

Utilizator Burbon13Burbon13 Burbon13 Data 16 septembrie 2016 19:32:19
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
#include <vector>
#include <iostream>
#include <cmath>

using namespace std;

const int nmx = 100002;

int n,m;
vector <int> g[nmx];
int pos[2*nmx], t;
pair <int,int> dp[20][2*nmx], euler[2*nmx];

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

void dfs(int nod, int niv)
{
    euler[++t] = make_pair(niv,nod);
    pos[nod] = t;
    for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
    {
        dfs(*it,niv+1);
        euler[++t] = make_pair(niv,nod);
    }
}

void rmq()
{
    for(int i = 1; i <= t; ++i)
        dp[0][i] = euler[i];
    for(int i = 1; (1 << i) <= t; ++i)
        for(int j = 1; j + (1 << i) <= t + 1; ++j)
            dp[i][j] = min(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);

}

void answers()
{
    for(int i = 1; i <= m; ++i)
    {
        int nod1,nod2;
        scanf("%d %d", &nod1, &nod2);

        nod1 = pos[nod1];
        nod2 = pos[nod2];

        if(nod1 > nod2)
            swap(nod1,nod2);

        int pt2 = log2(nod2-nod1+1);

        pair <int,int> an = min(dp[pt2][nod1],dp[pt2][nod2-(1<<pt2)+1]);

        printf("%d\n", an.second);
    }
}

int main()
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    citire();
    dfs(1,0);
    rmq();
    answers();
    return 0;
}