Cod sursa(job #2445278)

Utilizator CharacterMeCharacter Me CharacterMe Data 3 august 2019 12:19:39
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#define maxl int(log2(400000))+2
using namespace std;
int n, m, i, j, rmq[maxl][400004], level[100001], head[100001], v, first[100001];
vector<int> graph[100001];
void dfs(int node);
int mn(int node1, int node2);
int main()
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i=2; i<=n; ++i) {
        int h;
        scanf("%d", &h);
        graph[h].push_back(i); head[i]=h;
    }
    level[0]=-1;
    dfs(1);
    for(j=1; (1<<j)<=v; ++j){
        for(i=1; i<=v; ++i){
            int next=i+(1<<(j-1));
            rmq[j][i]=rmq[j-1][i];
            if(next<=v) rmq[j][i]=mn(rmq[j][i], rmq[j-1][next]);
        }
    }
    for(i=1; i<=m; ++i){
        int x, y;
        scanf("%d%d", &x, &y);
        x=first[x]; y=first[y];
        j=log2(y-x+1);
        printf("%d\n", mn(rmq[j][x], rmq[j][y-(1<<j)+1]));
    }
    return 0;
}
void dfs(int node){
    level[node]=level[head[node]]+1;
    for(auto i:graph[node]){
        rmq[0][++v]=node;
        if(!first[node]) first[node]=v;
        dfs(i);
    }
    rmq[0][++v]=node;
    if(!first[node]) first[node]=v;
    return;
}
int mn(int node1, int node2){
    if(level[node1]<=level[node2]) return node1;
    else return node2;
}