Cod sursa(job #1006273)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 6 octombrie 2013 19:41:00
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#define N 100005
using namespace std;
vector <int> G[N];
int n,m,t[N],k,a[N<<1],niv[N<<1],f[N],rm[N<<1][20],log[N<<1];
inline int min(int x,int y){ if(x<y)return x; else return y; return 0; }
void parcurg_euler(int nod,int l)
{ int i;
a[++k]=nod; niv[k]=l; f[nod]=k;
for(i=0;i<G[nod].size();++i)
    {
    parcurg_euler(G[nod][i],l+1);
    a[++k]=nod; niv[k]=l;
    }
}
void rmq()
{ int i,j;
log[1]=0; rm[1][0]=1;
for(i=2;i<=k;++i){ log[i]=log[i>>1]+1; rm[i][0]=i; }
for(j=1;(1<<j)<=k;++j)
    for(i=1;i<=k-(1<<j)+1;++i)
        if(niv[rm[i][j-1]]<niv[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];
}
int main()
{ int m,x,y,dif;
char sir[N*10],*p;
freopen("lca.in","r",stdin); scanf("%d %d\n",&n,&m);
gets(sir); p=strtok(sir," "); int i=2;
while(p!=NULL)
    {
    t[i]=strtol(p,NULL,10); G[t[i]].push_back(i);
    ++i; p=strtok(NULL," ");
    }
parcurg_euler(1,0);
rmq();
freopen("lca.out","w",stdout);
for(;m>=1;--m)
    {
    scanf("%d %d\n",&x,&y);
    if(f[x]>f[y])x=x^y^(y=x); // interschimba x cu y
    dif=log[f[y]-f[x]+1];
    if(niv[rm[f[x]][dif]]<niv[rm[f[y]-(1<<dif)+1][dif]])printf("%d\n",a[rm[f[x]][dif]]);
                    else printf("%d\n",a[rm[f[y]-(1<<dif)+1][dif]]);
    }
fclose(stdin);
fclose(stdout);
return 0;
}