Cod sursa(job #2126452)

Utilizator AsttridMocanu Ada Astrid Asttrid Data 9 februarie 2018 17:20:11
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=200001;

int d[18][N];
int n,m,viz[N],Niv[N],q[N],u,sol,l,poz[N];
vector<int>L[N/2];

void citire(){
in>>n>>m;
int i,x;
for(i=2;i<=n;i++){
in>>x;
L[x].push_back(i);
}
}

void dfs_euler(int x,int niv){int i,z;
viz[x]=1;
q[++u]=x;
Niv[u]=niv;
poz[x]=u;
for(i=0;i<L[x].size();i++)
    {z=L[x][i];
    if(!viz[z]){dfs_euler(z,niv+1);
    q[++u]=x;
    Niv[u]=niv;}}}

int cmp(int x,int y){
if(Niv[x]<Niv[y])return x;
else return y;
}


void constr(){
int i,j,p=1,uu;
for(i=1;i<=u;i++)
    d[0][i]=i;


uu=u-1;
l=log2(u);

for(i=1;i<=l;i++,p*=2,uu-=p)
for(j=1;j<=uu;j++)
d[i][j]=cmp(d[i-1][j],d[i-1][j+p]);


}


void rmq(int x,int y){
int w,k,p,minn;
if(x>y)swap(x,y);
w=y-x+1;
k=log2(w);
p=pow(2,k);


out<<q[cmp(d[k][x],d[k][y+1-p])]<<"\n";
}

void rez(){

int i,x,y;
for(i=1;i<=m;i++)
{in>>x>>y;
rmq(poz[x],poz[y]);}
}

int main(){int i,j;
citire();
dfs_euler(1,0);
constr();


rez();
return 0;}