Cod sursa(job #1000120)

Utilizator thewildnathNathan Wildenberg thewildnath Data 22 septembrie 2013 01:25:42
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>
#include<vector>
using namespace std;
int h[300002],d[20][300002],l[100002],Log[300002],e[300002];
vector <int> v[100002];

void rmq()
{
    int i,j;
    Log[1]=1;
    for(i=2;i<=e[0];++i)
        Log[i]=Log[i/2]+1;

    for(i=1;i<=e[0];++i)
        d[0][i]=i;
    for(i=1;(1<<i)<=e[0];++i)
        for(j=1;(j+(1<<i)-1)<=e[0];++j)
            if(l[d[i-1][j]]<l[d[i-1][j+(1<<(i-1))]])
                d[i][j]=d[i-1][j];
            else
                d[i][j]=d[i-1][j+(1<<(i-1))];
}

void dfs(int x,int niv)
{
    e[++e[0]]=x;
    l[e[0]]=niv;
    h[x]=e[0];
    for(vector<int> ::iterator it=v[x].begin();it!=v[x].end();++it)
    {
        dfs(*it,niv+1);
        e[++e[0]]=x;
        l[e[0]]=niv;
    }
}

inline void sol(int x,int y)
{
    int aux;
    x=h[x];
    y=h[y];
    if(x>y)
    {
        aux=y;
        y=x;
        x=aux;
    }
    aux=Log[y-x+1]-1;
    if(l[d[aux][x]]<l[d[aux][y-(1<<aux)+1]])
        printf("%d\n",e[d[aux][x]]);
    else
        printf("%d\n",e[d[aux][y-(1<<aux)+1]]);
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int n,m,i,j,x,y,aux,nr;
    scanf("%d%d",&n,&m);
    for(i=2;i<=n;++i)
    {
        scanf("%d",&x);
        v[x].push_back(i);
    }
    dfs(1,0);
    rmq();
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        sol(x,y);
    }
    return 0;
}