Cod sursa(job #897111)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 27 februarie 2013 18:52:40
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define INF 100005

using namespace std;

int n,m,d[18][INF],first[INF],lg[INF];
vector<int> v,arb[INF];

void oil(int nod)
{
    v.push_back(nod);
    if(first[nod]==0)first[nod]=v.size()-1;
    for(int i=0;i<arb[nod].size();++i)
    {
        int nod2=arb[nod][i];
        oil(nod2);
        v.push_back(nod);
    }
}

void rmq()
{
    n=v.size();

    lg[1]=0;
    for(int i=2;i<=n;++i)lg[i]=lg[i/2]+1;

    for(int i=0;i<v.size();++i)d[0][i]=v[i];

    for(int i=1;i<=lg[n];++i)
        for(int j=0;j<n-(1<<i);++j)
            d[i][j]=min(d[i-1][j],d[i-1][j+(1<<(i-1))]);
}

int querry(int a,int b)
{
    a=first[a];
    b=first[b];
    int k=lg[b-a+1];
    return min(d[k][a],d[k][b-(1<<k)+1]);
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);

    scanf("%d%d",&n,&m);
    for(int i=1;i<n;++i)
    {
        int x;
        scanf("%d",&x);
        arb[x].push_back(i+1);
    }
    oil(1);
    rmq();
    for(int i=0;i<m;++i)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",querry(a,b));
    }
    return 0;
}