Cod sursa(job #1398244)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 24 martie 2015 08:02:45
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <vector>
#include <bitset>
#define NMax 100002
#define INF 1<<30
#define minim(a,b)((a>b)?b:a)
#define maxim(a,b)((a>b)?a:b)
using namespace std;
std::vector<int> G[NMax],parc,nivel;
int n,m,x,y,a[NMax],nivelac,nod;
std::bitset<NMax> viz;
void parc_euler(int x0)
{
    parc.push_back(x0);
    nivel.push_back(nivelac);
    if(a[x0]==0)a[x0]=parc.size()-1;
    viz[x0] = true;
    for(int i=0;i<G[x0].size();++i)
    {
        if(!viz[G[x0][i]])
        {
            ++nivelac;
            parc_euler(G[x0][i]);
            --nivelac;
            parc.push_back(x0);
            nivel.push_back(nivelac);
        }
    }
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=2;i<=n;++i)
    {
        scanf("%d",&x);
        G[x].push_back(i);
    }
    parc_euler(1);
    /*for(int i=0;i<parc.size();++i)printf("%d ",parc[i]);
    printf("\n");
    for(int i=0;i<nivel.size();++i)printf("%d ",nivel[i]);
    printf("\n");
    for(int i=1;i<=n;++i)printf("%d ",a[i]);*/
    for(int i=1;i<=m;++i)
    {
        nivelac = INF;
        scanf("%d %d",&x,&y);
        for(int j=minim(a[x],a[y]);j<=maxim(a[x],a[y]);++j)
        {
            if(nivel[j]<nivelac)
            {
                nivelac = nivel[j];
                nod = parc[j];
            }
        }
        printf("%d\n",nod);
    }
    return 0;
}