Pagini recente » Cod sursa (job #1538666) | Cod sursa (job #251409) | Cod sursa (job #1974819) | Cod sursa (job #3160908) | Cod sursa (job #2517405)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, m, dad, mn[20][200001],pmin[200001], pmax[200001];
bool viz[100100];
vector <int> sn[100001];
vector <pair<int,int> > eul;
void dfs(int x,int dpth);
void rmq();
int main()
{
cin>>n>>m;
for(int i=2; i<=n; ++i)
{
cin>>dad;
sn[dad].push_back(i);
}
eul.push_back({0,0});
dfs(1,0);///
rmq();
for(int i=1; i<eul.size(); ++i)
if(!pmin[eul[i].first])
pmin[eul[i].first]=i;
int lft, rght, lg, l2, p2,x,y;
for(int i=1; i<=m; ++i)
{
cin>>lft>>rght;
x=pmin[lft];
y=pmin[rght];
if(x>y)
swap(x,y);
lg=y-x+1;
p2=log2(lg);
l2=pow(2,p2);
cout<<min(mn[p2][y],mn[p2][x+l2-1])<<'\n';
}
/**/
return 0;
}
void dfs(int x,int dpth)
{
eul.push_back({x,dpth});
viz[x]=1;
for(int i=0; i<sn[x].size(); ++i)
if(!viz[sn[x][i]])
{
dfs(sn[x][i],dpth+1);
eul.push_back({x,dpth});
}
}
void rmq()
{
for(int i=1; i<eul.size(); ++i)
mn[0][i]=eul[i].first;
for(int p=2, exp=1; p<eul.size(); p*=2, ++exp)
for(int ind=p; ind<eul.size(); ++ind)
mn[exp][ind]=min(mn[exp-1][ind],mn[exp-1][ind-(p/2)]);
}