Cod sursa(job #611195)

Utilizator proflaurianPanaete Adrian proflaurian Data 31 august 2011 10:49:52
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<cstdio>
#include<vector>
#define N 150010
#define M 250010
using namespace std;
vector<int> S[N],ST;
int n,q,m,i,j,k,u,v,x,y,z,T[N],P[N],L[N],LA,LN,X[M],Q[18][M];
int main()
{
    freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(i=2;i<=n;i++){scanf("%d",&j);S[j].push_back(i);T[i]=j;}
    ST.push_back(1);
    for(;ST.size();)
    {
        i=ST.back();Q[0][++m]=i;
        if(!P[i]){P[i]=m;L[i]=L[T[i]]+1;}
        if(!S[i].size()){ST.pop_back();continue;}
        j=S[i].back();ST.push_back(j);S[i].pop_back();
    }
    for(i=2;i<=m;i<<=1)X[i]=1;
    for(i=1;i<=m;i++)X[i]+=X[i-1];
    for(i=0,j=1;;i++,j++)
    {
        LA=1<<i;LN=1<<j;
        if(LN>m)break;
        for(k=1;k+LA<=m;k++)
        {
            u=Q[i][k];v=Q[i][k+LA];
            Q[j][k]=L[u]<L[v]?u:v;
        }
    }
    for(;q;q--)
    {
        scanf("%d%d",&u,&v);
        u=P[u];v=P[v];x=min(u,v);y=u+v-x;
        k=X[y-x+1];j=1<<k;
        u=Q[k][x];v=Q[k][y-j+1];
        printf("%d\n",L[u]<L[v]?u:v);
    }
    return 0;
}