Pagini recente » Cod sursa (job #1481596) | Cod sursa (job #3209067) | Cod sursa (job #2141023) | Cod sursa (job #1966) | Cod sursa (job #3139193)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,i,x,p,q,v[500001],h[100001],a[100001],ct,mat[21][500001],nvl[21][500001],ptr[21],k;
vector <int> vct[100001];
void dfs(int k,int hk){
++ct; v[ct]=k; h[k]=hk; a[k]=ct;
int i;
for(i=0;i<vct[k].size();++i){
dfs(vct[k][i],hk+1);
++ct; v[ct]=k;
}
}
int putere(int k){
int p=0;
while(k){
++p; k/=2;
}
return p-1;
}
int rmq(int x,int y){
x=a[x]; y=a[y];
if(x>y) swap(x,y);
int p,mi;
p=putere(y-x+1);
if(nvl[p][x]<nvl[p][y-ptr[p]+1]) return mat[p][x];
else return mat[p][y-ptr[p]+1];
}
int main()
{
f>>n>>m;
for(i=2;i<=n;++i){
f>>x;
vct[x].push_back(i);
}
ct=0;
dfs(1,1);
//for(i=1;i<=ct;++i) cout<<v[i]<<' ';
for(i=1;i<=ct;++i) { mat[0][i]=v[i]; nvl[0][i]=h[v[i]]; }
ptr[0]=1;
for(i=1;i<=20;++i) ptr[i]=ptr[i-1]*2;
for(k=1;k<=20;++k)
for(i=1;i<=ct;++i){
if(nvl[k-1][i] < nvl[k-1][i+ptr[k-1]]){
nvl[k][i]=nvl[k-1][i];
mat[k][i]=mat[k-1][i];
}
else{
nvl[k][i]=nvl[k-1][i+ptr[k-1]];
mat[k][i]=mat[k-1][i+ptr[k-1]];
}
}
for(i=1;i<=m;++i){
f>>p>>q;
g<<rmq(p,q)<<'\n';
}
return 0;
}