Pagini recente » Cod sursa (job #2856279) | Cod sursa (job #2662095) | Cod sursa (job #698497) | Cod sursa (job #1049529) | Cod sursa (job #3277607)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector<int> v[100001],e;
int st[100001],cnt;
int max_put[200001];
int dr[100001];
int adan[100001];
int rmq[200001][21];
int ind[1000001][31];
void dfs(int tata,int nod){
st[nod]=cnt;e.push_back(nod);cnt++;
for(auto it:v[nod]){
adan[it]=adan[nod]+1;
dfs(nod,it);
dr[nod]=cnt;e.push_back(nod);cnt++;
}
}
void const_sp(){
int aux1,put,i,j;
for(i=2;i<=200000;i++){
max_put[i]=max_put[i/2]+1;
}
aux1=max_put[e.size()];
put=1;
for(i=1;i<=aux1;i++){
for(j=0;j+put*2-1<e.size();j++){
if(rmq[j][i-1]<rmq[j+put][i-1]){
rmq[j][i]=rmq[j][i-1];
ind[j][i]=ind[j][i-1];
}else{
rmq[j][i]=rmq[j+put][i-1];
ind[j][i]=ind[j+put][i-1];
}
}
put*=2;
}
}
int main()
{
int n,m,i,a,b,auxa,auxb;
cin>>n>>m;
for(i=2;i<=n;i++){
cin>>a;
v[a].push_back(i);
}
for(i=1;i<=n;i++) st[i]=dr[i]=-1;
dfs(1,1);
for(i=0;i<e.size();i++){
///printf("%d %d\n",e[i],adan[e[i]]);
rmq[i][0]=adan[e[i]];
ind[i][0]=e[i];
}
const_sp();
for(i=1;i<=n;i++){
if(dr[i]==-1) dr[i]=st[i];
}
for(i=1;i<=m;i++){
cin>>auxa>>auxb;
a=min(st[auxa],st[auxb]);
b=max(dr[auxa],dr[auxb]);
/// printf("%d %d|\n",a,b);
int len=(b-a+1);
if(rmq[a][max_put[len]]<rmq[b-(1<<max_put[len])+1][max_put[len]]){
cout<<ind[a][max_put[len]]<<"\n";
}else{
cout<<ind[b-(1<<max_put[len])+1][max_put[len]]<<"\n";
}
}
return 0;
}