Cod sursa(job #1144961)

Utilizator DeclinGogonea Andrei Declin Data 17 martie 2014 19:26:51
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
using namespace std;
struct nod
{
    int x;
    nod *u;
};
nod *arb[100001];
int a[200001],poz[100001],ad[100001],nr;
void add(int i,int x)
{
    nod *q=new nod;
    ad[i]=ad[x]+1;
    q->x=i;
    q->u=arb[x];
    arb[x]=q;

}
void eulerizare(int x)
{
    a[nr]=x;
    if (poz[x]==0)
       poz[x]=nr;
    ++nr;
    while(arb[x]!=NULL)
    {
        eulerizare(arb[x]->x);
        a[nr]=x;
        ++nr;
        arb[x]=arb[x]->u;
    }

}
int lca(int x,int y)
{
  int i,mix=ad[x],stix=x;
  if(poz[x]>poz[y])
  {
      for(i=poz[x]-1;i>=poz[y];--i)
  if (mix>ad[a[i]]) {
      mix=ad[a[i]];
      stix=a[i];
  }
  }
  else
  for(i=poz[x]+1;i<=poz[y];++i)
  if (mix>ad[a[i]]) {
      mix=ad[a[i]];
      stix=a[i];
  }
  return stix;
}
int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    int n,m,i,x,y;
    scanf("%d%d",&n,&m);
    ad[1]=0;
    for(i=2;i<=n;++i)
    {
        scanf("%d",&x);
        add(i,x);
    }
    eulerizare(1);
    while(m!=0)
    {
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
        --m;
    }
    return 0;
}