Cod sursa(job #2165028)

Utilizator aditzu7Adrian Capraru aditzu7 Data 13 martie 2018 10:52:03
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
FILE*f=fopen("lca.in","r");
FILE*g=fopen("lca.out","w");

int e[200001],k,ap[200001],rm[200001][20],t,use[200001],sol,b,a2,j,a[200001],v[200001],n,m,i,j2;
struct nod{
int inf;
nod *urm;

}*l[100001];
void adaug(nod *&p,int x){
nod *c;
c=new nod;
c->urm=p;
c->inf=x;
p=c;

}
void df(int i,int wt){
 v[++k]=wt;
 e[k]=i;
  if(!ap[i])ap[i]=k;
use[i]=1;
nod *c;
for(c=l[i];c;c=c->urm){
   if(!use[c->inf]){ df(c->inf,wt+1);
  v[++k]=wt;
  e[k]=i;
  //if(!ap[i])ap[i]=k;
}




}



} void rmq(){n=k;
    for(i=1;i<=n;i++)rm[i][0]=i;
for(j=1;(1<<j)<=n;j++)
    for(i=1;i<=n-(1<<j)+1;i++)
 {
   if(v[rm[i][j-1]]<v[rm[i+(1<<(j-1))][j-1]]) rm[i][j]=rm[i][j-1];
else rm[i][j]=rm[i+(1<<(j-1))][j-1];


 }
 for(t=1;t<=m;t++){
    fscanf(f,"%d%d",&a2,&b);sol=100001;
    a2=ap[a2];
    b=ap[b];
    if(a2>b){
        int aux=a2;
        a2=b;
        b=aux;

    }
   int dif=b-a2+1;
   int l=(int)(log2(dif));

    fprintf(g,"%d\n",e[min(rm[a2][l],rm[b-(1<<l)+1][l])]);
 }
}
int main()
{
 fscanf(f,"%d%d",&n,&m);
for(i=2;i<=n;i++){int x;
        fscanf(f,"%d",&x);
adaug(l[i],x);
adaug(l[x],i);
}
df(1,0);
rmq();
    return 0;
}