Cod sursa(job #1777979)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 13 octombrie 2016 09:56:21
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> a[100005];
int b[400005],h[100005],sb=0;
int rmq[25][400005];
int n,m,x,y;

void Make(int nod){
    b[++sb]=nod;
    if(!h[nod]) h[nod]=sb;
    for(int i=0;i<a[nod].size();i++){
        Make(a[nod][i]);
        b[++sb]=nod;
    }
}

void BuildRMQ(){
    for(int i=1;i<=sb;i++) rmq[0][i]=b[i];
    for(int i=1;(1<<i)<=sb;i++){
        for(int j=1;j<=sb-(1<<i)+1;j++){
            rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
        }
    }
}

int RMQ(int l, int r){
    int k = (int)log2(r-l+1);
    return min(rmq[k][l],rmq[k][r-(1<<k)+1]);
}

int main()
{
    ifstream in("lca.in");
    ofstream out("lca.out");
    in >> n >> m;
    for(int i=2;i<=n;i++){
        in >> x;
        a[x].push_back(i);
    }
    Make(1);
    //for(int i=1;i<=sb;i++) cout << b[i] << ' ';
    BuildRMQ();
    for(int i=1;i<=m;i++){
        in >> x >> y;
        if(h[x]<h[y]) out << RMQ(h[x],h[y]) << '\n';
        else out << RMQ(h[y],h[x]) << '\n';
    }
}