Cod sursa(job #1133351)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 4 martie 2014 19:54:19
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#define nmax 100009
using namespace std;
int aparitie[nmax],dad[nmax];
struct nod
{
    int val;
    int nivel;
};
struct vecini
{
    vector<int> v;
};
vecini g[nmax];
vector <nod> euler;
int d[nmax][40];
void DFS(int n,int k)
{
    int i;
    nod aux;
    aux.nivel=k;
    aux.val=n;
    euler.push_back(aux);
    if(aparitie[n]==0)
    {
        aparitie[n]=euler.size()-1;
    }
    for(i=0;i<g[n].v.size();++i)
    {
        DFS(g[n].v[i],k+1);
        nod aux;
        aux.nivel=k;
        aux.val=n;
        euler.push_back(aux);
    }
}
int main()
{
    int i,n,m,x,j,y,k;
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=2;i<=n;i++)
    {
        scanf("%d",&x);
        g[x].v.push_back(i);
    }
    nod start;
    start.val=0;
    start.nivel=0;
    euler.push_back(start);
    aparitie[1]=1;
    DFS(1,0);
    int lung=euler.size()-1;
    for(i=1;i<=lung;i++)
        d[i][0]=i;
    for(j=1;(1<<j)<=lung;j++)
        for(i=1;i+(1<<j)-1<=lung;i++)
            if(euler[d[i][j-1]].nivel>euler[d[i+(1<<(j-1))][j-1]].nivel)
                d[i][j]=d[i+(1<<(j-1))][j-1];
            else
                d[i][j]=d[i][j-1];
            //d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        x=aparitie[x];y=aparitie[y];
        k=log2(abs(y-x+1));
        if(euler[d[x][k]].nivel<euler[d[y-(1<<k)+1][k]].nivel)
            printf("%d\n",euler[d[x][k]].val);
        else
            printf("%d\n",euler[d[y-(1<<k)+1][k]].val);
    }
    return 0;
}