Cod sursa(job #1075253)

Utilizator dan.ghitaDan Ghita dan.ghita Data 8 ianuarie 2014 19:34:02
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, lvl[100005], a[20][10000000], lca[100005], x, y, p, sz;
vector<int> lv[100005];
vector<int> v, rmq;

void df(int x)
{
    a[0][++sz]=x;
    vector<int>::iterator it;
    for(it=lv[x].begin(); it!=lv[x].end(); ++it)
            df(*it), v.push_back(x), a[0][++sz]=x;
}

void RMQ(){

for(int i=sz; i>0; --i)
        for(int k=1; (1<<k)<=sz; ++k)
            if(lvl[a[k-1][i]]<lvl[a[k-1][i+(1<<(k-1))]])
                a[k][i]=a[k-1][i];
            else
                a[k][i]=a[k-1][i+(1<<(k-1))];

}

int main()
{
    f>>n>>m;
    lvl[1]=0;
    for(int i=2; i<=n; ++i)
        f>>x, lvl[i]=lvl[x]+1, lv[x].push_back(i);
    df(1);
    RMQ();
    for(int i=1; i<=sz; ++i)
        if(!lca[a[0][i]]) lca[a[0][i]]=i;
    while(m--){
        f>>x>>y;
        x=lca[x];
        y=lca[y];
        if(y<x) swap(x,y);
        p=(int)log2(y-x+1);
        if(lvl[a[p][x]]<lvl[a[p][y-(1<<p)+1]])
                g<<a[p][x]<<'\n';
            else
                g<<a[p][y-(1<<p)+1]<<'\n';
            }
    return 0;
}