Cod sursa(job #786038)

Utilizator stefanzzzStefan Popa stefanzzz Data 10 septembrie 2012 13:42:23
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <math.h>
#define MAXN 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

int n,m,s,x,y,aux,tata[MAXN],fa[MAXN],mn[500000][20],cnt,lg;
vector<int> G[MAXN],dfv;

void dfs(int p);
int MIN(int a,int b);

int main()
{
    int i,j;
    f>>n>>m;
    for(i=2;i<=n;i++){
        f>>tata[i];
        G[tata[i]].push_back(i);}
    dfs(1);
    s=dfv.size();
    for(i=0;i<s;i++)
        mn[i][0]=dfv[i];
    for(i=2;i<=s;i<<=1){
        cnt++;
        for(j=0;j+i<=s;j++)
            mn[j][cnt]=MIN(mn[j][cnt-1],mn[j+i/2][cnt-1]);}
    for(i=1;i<=m;i++){
        f>>x>>y;
        x=fa[x];
        y=fa[y];
        if(x>y){
            aux=x;
            x=y;
            y=aux;}
        lg=(int)(log2(((double)(y-x+1))));
        g<<MIN(mn[x][lg],mn[y-(1<<lg)+1][lg])<<'\n';}
    f.close();
    g.close();
    return 0;
}

void dfs(int p){
    int i;
    fa[p]=dfv.size();
    dfv.push_back(p);
    for(i=0;i<G[p].size();i++){
        dfs(G[p][i]);
        dfv.push_back(p);}}

int MIN(int a,int b){
    return a<b?a:b;}