Cod sursa(job #1075256)

Utilizator dan.ghitaDan Ghita dan.ghita Data 8 ianuarie 2014 19:38:22
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 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][1000000], lca[100005], x, y, p, sz;
vector<int> lv[100005];

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)<=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;
}