Pagini recente » Cod sursa (job #1012330) | Cod sursa (job #1939638) | Cod sursa (job #2865760) | Cod sursa (job #2492335) | Cod sursa (job #2788021)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector<int>mu[100002];
int n,q,x,f[100002],v[100002],k,level[100002],app[100002],rmq[100002][22];
void DFS(int x,int l)
{
f[x]++;
v[++k]=x;
if(app[x]==0)
app[x]=k;
rmq[k][0]=x;
for(int i=0; i<mu[x].size(); i++)
if(f[mu[x][i]]==0)
{
level[mu[x][i]]=l+1;
DFS(mu[x][i],l+1);
v[++k]=x;
rmq[k][0]=x;
}
}
int main()
{
cin>>n>>q;
for(int i=2; i<=n; i++)
{
cin>>x;
mu[i].emplace_back(x);
mu[x].emplace_back(i);
}
f[1]=1;
DFS(1,0);
///RMQ
for(int lg=2,exp=1; lg<=k; lg*=2,exp++)
for(int i=1; i+lg-1<=k; i++)
{
if(level[rmq[i][exp-1]]>level[rmq[i+lg/2][exp-1]])
rmq[i][exp]=rmq[i+lg/2][exp-1];
else
rmq[i][exp]=rmq[i][exp-1];
}
for(int i=1; i<=q; i++)
{
int x,y;
cin>>x>>y;
x=app[x];
y=app[y];
if(x>y)
swap(x,y);
int lg=y-x+1;
int p=1;
int exp=0;
while(p<=lg)
{
p*=2;
exp++;
}
p/=2;
exp--;
if(level[rmq[x][exp]]>level[rmq[y-p+1][exp]])
cout<<rmq[y-p+1][exp]<<'\n';
else
cout<<rmq[x][exp]<<'\n';
}
/* for(int i=1; i<=k; i++)
{
for(int j=0; j<=k/2; j++)
cout<<rmq[i][j]<<' ';
cout<<'\n';
}
for(int i=1; i<=k; i++)
cout<<v[i]<<' ';
cout<<'\n';
for(int i=1; i<=k; i++)
cout<<level[v[i]]<<' ';
cout<<'\n';
for(int i=1; i<=n; i++)
{
for(int j=0; j<mu[i].size(); j++)
cout<<mu[i][j]<<' ';
cout<<'\n';
}
for(int i=1; i<=n; i++)
cout<<app[i]<<' ';*/
}