Pagini recente » Cod sursa (job #2726999) | Cod sursa (job #2737001) | Cod sursa (job #731116) | Cod sursa (job #791522) | Cod sursa (job #2505012)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,l[200010],a[40][200010],putere,x,y,level[200010],euler[200010],poz[200010],len,putere1;
vector<int> v[200010];
void dfs(int nod,int niv){
len++;
level[len]=niv;
euler[len]=nod;
poz[nod]=len;
for(int i=0;i<v[nod].size();i++){
dfs(v[nod][i],niv+1);
len++;
level[len]=niv;
euler[len]=nod;
}
}
int main(){
fin>>n>>m;
for(int i=2;i<=n;i++){
fin>>x;
v[x].push_back(i);
}
dfs(1,1);
for(int i=2;i<=len;i++){
l[i]=l[i/2]+1;
}
for(int i=1;i<=len;i++){
a[0][i]=i;
}
for(int i=1;i<=l[len]+1;i++){
putere=(1<<(i-1));
for(int j=1;j<=len-(1<<i)+1;j++){
a[i][j]=a[i-1][j];
if(level[ a[i][j] ]>level[ a[i-1][j+putere] ]){
a[i][j]=a[i-1][j+putere];
}
}
}
for(int i=1;i<=m;i++){
fin>>x>>y;
x=poz[x];
y=poz[y];
if(x>y){
swap(x,y);
}
putere=l[y-x+1];
putere1=y-(1<<putere)+1;
if(level[a[putere][x]]<level[a[putere][putere1]]){
fout<<euler[a[putere][x]]<<"\n";
}
else{
fout<<euler[a[putere][putere1]]<<"\n";
}
}
}