Pagini recente » Cod sursa (job #2633431) | Cod sursa (job #179814) | Cod sursa (job #1556582) | Cod sursa (job #490789) | Cod sursa (job #2790915)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
vector<int>mu[100002];
int n,q,lca[2*210002][22],v[210002],level[210002],k,x,app[210002];
void DFS(int x,int l)
{
v[++k]=x;
if(app[x]==0)
app[x]=k;
level[k]=l;
for(int i=0;i<mu[x].size();i++)
{
DFS(mu[x][i],l+1);
level[++k]=l;
v[k]=x;
}
}
int main()
{
cin>>n>>q;
for(int i=2;i<=n;i++)
{
cin>>x;
mu[x].emplace_back(i);
}
DFS(1,0);
for(int i=1;i<=k;i++)
lca[i][0]=i;
for(int lg=2,exp=1;lg<=k;lg*=2,exp++)
for(int i=1;i+lg-1<=k;i++)
{
if(level[lca[i][exp-1]]>level[lca[i+lg/2][exp-1]])
lca[i][exp]=lca[i+lg/2][exp-1];
else
lca[i][exp]=lca[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[lca[x][exp]]>level[lca[y-p+1][exp]])
cout<<v[lca[y-p+1][exp]]<<'\n';
else
cout<<v[lca[x][exp]]<<'\n';
}
}