Cod sursa(job #1198799)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 17 iunie 2014 11:05:27
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>
#define N 100010
#define M 1700010
using namespace std;
int T[N],P[N],niv[N];
int n,m,i,k,pre[M],val,j,K;
vector<int> E[17],v[N];
void euler(int),rmq();
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=2;i<=n;i++)
    {
        scanf("%d",&T[i]);
        v[T[i]].push_back(i);
    }
    E[0].push_back(0);
    euler(1);
    rmq();
    for(i=2;i<=k;i++)
    {
        pre[i]=val;
        if(i==(i&(-i)))val++;
    }
    for(;m;m--)
    {
        scanf("%d%d",&i,&j);
        i=P[i];
        j=P[j];
        if(i>j)
            i^=j^=i^=j;
        k=j-i+1;k=pre[k];
        K=1<<k;
        j=j-K+1;
        i=E[k][i];
        j=E[k][j];
        niv[i]<niv[j]?printf("%d\n",i):printf("%d\n",j);
    }
    return 0;
}
void euler(int nod)
{
    niv[nod]=niv[T[nod]]+1;k++;
    P[nod]=k;
    E[0].push_back(nod);
    for(vector<int> ::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        euler(*it);
        E[0].push_back(nod);k++;
    }
}
void rmq()
{
    int R,L,St,Mi,j;
    for(i=1,j=2;j<=k;i++,j<<=1)
    {
        E[i].push_back(0);
        for(L=1,R=j;R<=k;L++,R++)
        {
            St=E[i-1][L];
            Mi=E[i-1][L+j/2];
            St=niv[St]<niv[Mi]?St:Mi;
            E[i].push_back(St);
        }
    }
}