Pagini recente » Cod sursa (job #786246) | Cod sursa (job #92010) | Cod sursa (job #1713272) | Cod sursa (job #2150115) | Cod sursa (job #2499927)
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
long int n,m,k,x,y,pow2,pow;
long int a[18][200002],log[200002],euler[200002],nivel[200002],poz[200002];
vector<int> L[200002];
void dfs(int nod,int niv){
nivel[++k]=niv;
euler[k]=nod;
poz[nod]=k;
for(int i=0;i<L[nod].size();i++){
dfs(L[nod][i],niv+1);
k++;
nivel[k]=niv;
euler[k]=nod;
}
}
int main () {
fin>>n>>m;
for(int i=2;i<=n;i++){
fin>>x;
L[x].push_back(i);
}
///
dfs(1,1);
///
for(int i=2;i<=k;i++){
log[i]=log[i/2]+1;
}
for(int i=1;i<=k;i++){
a[0][i]=i;
}
for(int i=1; (1<<i) <=k;i++){
for(int j=1;j<=k- (1<<i) +1;j++){
pow=1<<(i-1);
a[i][j]=a[i-1][j];
if(nivel[ a[i][j] ]>nivel[ a[i-1][j+pow] ]){
a[i][j]=a[i-1][j+pow];
}
}
}
for(int i=1;i<=m;i++){
fin>>x>>y;
x=poz[x];
y=poz[y];
if(x>y){
int aux=x;
x=y;
y=aux;
}
pow=log[y-x+1];
pow2=y-(1<<pow)+1;
if(nivel[a[pow][x]]<nivel[a[pow][pow2]]){
fout<<euler[ a[pow][x] ]<<"\n";
}
else{
fout<<euler[ a[pow][pow2] ]<<"\n";
}
}
return 0;
}