Pagini recente » Cod sursa (job #788143) | Cod sursa (job #702051) | Cod sursa (job #617235) | Cod sursa (job #2755321) | Cod sursa (job #1807634)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int pe[100005],lv[100005],f[100001],p[1000005][25],y,x1,y1,aux,lg;
vector <int> v[100005];
int n,m,i,j,x,k,last,niv;
void euler(int x)
{
for(int i=0;i<v[x].size();++i)
{
pe[++k]=x;
if(f[x]== 0) f[x]=k;
lv[k]=niv;
niv++;
euler(v[x][i]);
niv--;
}
pe[++k]=x;
lv[k]=niv;
if(f[x]== 0) f[x]=k;
}
void rmq()
{
for(i=0;i<=(int)log2(k);++i)
{
for(j=1;j<=k;++j)
{
if(i==0)
p[j][i]=lv[j];
else if(j+(1<<(i-1)) <=k)
p[j][i]=min(p[j][i-1],p[j+(1<<(i-1))][i-1]);
}
}
}
int main()
{
cin>>n>>m;
for(i=1;i<n;++i)
{
cin>>x;
v[x].push_back(i+1);
}
/// euler
euler(1);
/*for(i=1;i<=k;++i) cout<<pe[i]<<" ";
cout<<"\n";
for(i=1;i<=k;++i) cout<<lv[i]<<" ";
cout<<"\n";
for(i=1;i<=n;++i) cout<<f[i]<<" "; */
rmq();
//cout<<"\n";
for(i=1;i<=m;++i)
{
cin>>x1>>y1;
x=f[x1];
y=f[y1];
aux=y-x+1;
lg=(int)log2(aux);
if(x>y) swap(x,y);
for(j=x;j<=y;++j)
if(lv[j]==min(p[x][lg], p[y-(1<<lg)+1][lg]))
{
cout<<pe[j]<<"\n";
break;
}
// cout<<min(p[x][lg], p[y-(1<<lg)+1][lg])<<"\n";
}
return 0;
}