Cod sursa(job #2405953)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 15 aprilie 2019 10:55:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N, M, i, j, RMQ[21][200001], V, First[100001];
vector<int> Graph[100001];
void Euler(int node);
void RMP();
int main()
{
    fin>>N>>M;
    for(i=1; i<=N; ++i) Graph[i].push_back(0);
    for(i=2; i<=N; ++i){
        int s;
        fin>>s;
        Graph[s].push_back(i);
        ++Graph[s][0];
    }
    RMQ[0][++V]=1; First[1]=1;
    Euler(1);
    RMP();
    for(i=1; i<=M; ++i){
        int a, b, k;
        fin>>a>>b;
        a=First[a]; b=First[b];
        if(a>b) swap(a, b);
        k=log2(b-a+1);
        fout<<min(RMQ[k][a], RMQ[k][b-(1<<k)+1])<<"\n";
    }
    return 0;
}
void Euler(int node){
    int i;
    for(i=1; i<=Graph[node][0]; ++i){
        RMQ[0][++V]=Graph[node][i];
        if(First[Graph[node][i]]==0) First[Graph[node][i]]=V;
        Euler(Graph[node][i]);
        RMQ[0][++V]=node;
    }
    return;
}
void RMP(){
    for(j=1; (1<<j)<=V; ++j)
        for(i=1; i<=V; ++i) RMQ[j][i]=min(RMQ[j-1][i], (i+(1<<(j-1))<=V?RMQ[j-1][i+(1<<(j-1))]:100001));
    return;
}