Pagini recente » Cod sursa (job #1253003) | Cod sursa (job #1248600) | Cod sursa (job #1121727) | Cod sursa (job #15903) | Cod sursa (job #2328960)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,x,y;
int ap[100005],mn[22][200005];
vector<int>nod[100005],line,val;
void go_visit(int pos,int length)
{
line.push_back(pos);
val.push_back(length);
ap[pos]=line.size()-1;
for(int i=0;i<nod[pos].size();i++)
{
go_visit(nod[pos][i],length+1);
line.push_back(pos);
val.push_back(length);
}
}
void rmq()
{
for(int i=1;(1<<i)<=n+1;i++)
for(int j=0;j<=n-(1<<i);j++)
if(val[mn[i-1][j]]<val[mn[i-1][j+(1<<(i-1))]])
mn[i][j]=mn[i-1][j];
else
mn[i][j]=mn[i-1][j+(1<<(i-1))];
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>x;
nod[x].push_back(i);
}
go_visit(1,1);
n=line.size();
for(int i=0;i<n;i++)
mn[0][i]=i;
rmq();
for(int i=1;i<=m;i++)
{
fin>>x>>y;
x=ap[x];
y=ap[y];
if(x>y)
swap(x,y);
int j=0;
while((1<<(j+1))<=y-x+1)
j++;
if(y==1<<j)
{
fout<<line[mn[j][x]]<<"\n";
continue;
}
int p2=y-(1<<j)+1;
if(val[mn[j][x]]<val[mn[j][p2]])
fout<<line[mn[j][x]];
else
fout<<line[mn[j][p2]];
fout<<"\n";
}
return 0;
}