Cod sursa(job #1109720)

Utilizator TodeaDariustodea darius TodeaDarius Data 17 februarie 2014 15:21:15
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>
#include<vector>
using namespace std;
#define big 100005
int n,m,poz[big],it,t,k,x,y;
struct euler
{
    int p,niv;
}a[2*big];
struct matrice
{
    int min,poz;
}rmq[19][2*big];
vector<int>v[big];
void dfs(int x,int niv)
{
    ++it;
    poz[x]=it;
    a[it].p=x;
    a[it].niv=niv;
    rmq[0][it].min=x;
    rmq[0][it].poz=it;
    for(int i=0;i<v[x].size();i++)
        {
            dfs(v[x][i],niv+1);
            ++it;
            a[it].p=x;
            a[it].niv=niv;
             rmq[0][it].min=x;
             rmq[0][it].poz=it;
        }
}
int log(int x)
{
    int k,nr;
    k=1;nr=0;
    while(2*k<=x)
    {
        k*=2;
        nr++;
    }
    return nr;
}
matrice minim(matrice a,matrice b)
{
    matrice z;
    if(a.min<b.min)
    {
        z=a;
    }
    else z=b;
    return z;
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);

    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)
    {
        scanf("%d",&t);
        v[t].push_back(i+1);
    }
    dfs(1,1);
    k=log(it);
    for(int i=1;i<=k;i++)
        for(int j=1;j+(1<<i)-1<=it;j++)
            {
                rmq[i][j]=minim(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
            }
    matrice sol;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        x=poz[x];
        y=poz[y];
        if(y<x)
            swap(x,y);
        k=log(y-x+1);
        sol=minim(rmq[k][x],rmq[k][y-(1<<k)+1]);
        printf("%d\n",a[sol.poz].p);
    }
    return 0;
}