Cod sursa(job #1075198)

Utilizator dan.ghitaDan Ghita dan.ghita Data 8 ianuarie 2014 18:55:56
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, lvl[1000000], a[20][100000], lca[10000000], x, y, p, sz;
vector<int> lv[100000];
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), a[0][++sz]=x;

}

void RMQ(){

for(int i=sz; i>0; --i)
        for(int k=1; (1<<k)<=n; ++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];
        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;
}