Pagini recente » Cod sursa (job #1157516) | Cod sursa (job #1368244) | Cod sursa (job #2578251) | Cod sursa (job #2717763) | Cod sursa (job #1203748)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("lca.in");
ofstream o("lca.out");
int d[20][100000],l[100010],m,n,y,x;
int lca(int p,int q){
if(l[p]<l[q])swap(p,q);//p este mai departe de radacina ca q
int log1,log2;
for( log1=1;(1<<log1)<=l[q];log1++);log1--;
for( log2=1;(1<<log2)<=l[p];log2++);log2--;
for(int i=log2;i>=0;i--)
if(l[p]-(1<<i) >= l[q])p=d[i][p];
if(p==q)return p;
for(int i=log1;i>=0;i--)
if(d[i][p] != d[i][q]){
p=d[i][p];q=d[i][q];
}
return d[0][p];
}
int main(){
f>>n>>m;
l[1]=0;
d[0][1]=0;
int lmax=0;
for(int i=2;i<=n;i++)f>>d[0][i],l[i]=l[d[0][i]]+1,lmax=max(lmax,l[i]);
for(int i=1;(1<<i)<=lmax;i++)
for(int j=1;j<=n;j++)
d[i][j] = d[i-1][d[i-1][j]];
for(int i=1;i<=m;i++){
f>>x>>y;
o<<lca(x,y)<<endl;
}
}