Pagini recente » Cod sursa (job #335545) | Cod sursa (job #1201250) | Cod sursa (job #922606) | Cod sursa (job #2258522) | Cod sursa (job #2723203)
//#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int euclid[200005],fr[100005],niv[100005],rmq[22][200005],prod[22],logo[2000005],cnt,t[100005];
vector <int> v[100005];
ifstream cin("lca.in");
ofstream cout("lca.out");
void dfs(int nod){
euclid[++cnt]=nod;
fr[nod]=cnt;
for(auto u:v[nod]){
niv[u]=niv[nod]+1;
dfs(u);
euclid[++cnt]=nod;
}
}
int query(int st,int dr){
st=fr[st];
dr=fr[dr];
//cout<<st<<" "<<dr<<"\n";
int lg=logo[dr-st+1];
if(niv[euclid[rmq[lg][st]]]<niv[euclid[rmq[lg][dr-prod[lg]+1]]]){
return euclid[rmq[lg][st]];
}
return euclid[rmq[lg][dr-prod[lg]+1]];
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=2;i<=n;i++){
cin>>t[i];
v[t[i]].push_back(i);
}
niv[1]=1;
dfs(1);
prod[0]=1;
//return 0;
for(int i=1;i<=20;i++){
prod[i]=prod[i-1]*2;
//cout<<i<<" "<<prod[i]<<"\n";
logo[prod[i]]++;
}
//return 0;
for(int i=1;i<=200000;i++){
logo[i]+=logo[i-1];
}
for(int i=1;i<=cnt;i++){
rmq[0][i]=i;
}
for(int i=1;i<=20;i++){
for(int j=1;j+prod[i]-1<=cnt;j++){
if(niv[euclid[rmq[i-1][j]]]<niv[euclid[rmq[i-1][j+prod[i-1]]]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+prod[i-1]];
}
}
//for(int i=1;i<=cnt;i++){
//cout<<rmq[1][i]<<" ";
//}
//cout<<"\n";
int a,b;
for(int i=1;i<=m;i++){
cin>>a>>b;
cout<<query(a,b)<<"\n";
}
return 0;
}