Cod sursa(job #1804579)

Utilizator ghost24ghost ghost ghost24 Data 12 noiembrie 2016 19:18:00
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<iostream>
#include<fstream>
#include<vector>
#define DX 100010
using namespace std;
fstream fin("lca.in",ios::in),fout("lca.out",ios::out);
vector<int> v[DX];
int n,q,la,a[2*DX],bst[2*DX][19],first[2*DX],rad[2*DX];
void citire()
{
    int i,a;
    fin>>n>>q;
    for(i=2;i<=n;i++)
    {
        fin>>a;
        v[a].push_back(i);
    }
}
void dfs(int nod)
{
    la++;
    a[la]=nod;
    first[nod]=la;
    for(int i=0;i<v[nod].size();i++)
    {
        dfs(v[nod][i]);
        la++;
        a[la]=nod;
    }
}
void rmq()
{
    int i,j;
    for(j=1;(1<<j)<=la;j++) rad[(1<<j)]=j;
    for(i=1;i<=la;i++)
    {
        rad[i]=max(rad[i],rad[i-1]);
        bst[i][0]=a[i];
    }
    for(j=1;(1<<j)<=la;j++) for(i=1;i+(1<<j)<=la;i++) bst[i][j]=min(bst[i][j-1],bst[i+(1<<(j-1))][j-1]);
}
int query(int a,int b)
{
    //cout<<a<<" "<<b<<"\n";
    int l=b-a+1,r=rad[l];
    //cout<<a<<" "<<r<<" "<<bst[a][r]<<" "<<b-(1<<r)+1<<" "<<r<<" "<<bst[b-(1<<r)+1][r]<<"\n";
    return min(bst[a][r],bst[b-(1<<r)+1][r]);
}
int main()
{
    int i,a,b;
    citire();
    dfs(1);
    rmq();

    for(i=1;i<=q;i++)
    {
        fin>>a>>b;
        fout<<query(min(first[a],first[b]),max(first[a],first[b]))<<"\n";
    }
}