Pagini recente » Cod sursa (job #1658250) | Cod sursa (job #862618) | Cod sursa (job #1592872) | Cod sursa (job #1374413) | Cod sursa (job #1607326)
#include <fstream>
#include <bitset>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,j,x,first[100001],dif,ans,l,y,niv[200001],i,v[200001],val[200001][20],lg[200001];
bitset <100001> viz;
vector <int> fi[100001];
void dfs(int x,int lev)
{
int j=0;
v[++l]=x;
niv[l]=lev;
viz[x]=true;
first[x]=l;
for (j=0;j<fi[x].size();j++)
if (viz[fi[x][j]]==false)
dfs(fi[x][j],lev+1),v[++l]=x,niv[l]=lev;
}
int main()
{
f>>n>>m;
for (i=2;i<=n;i++)
{
f>>x;
fi[x].push_back(i);
}
dfs(1,0);
for (i=1;i<=l;i++)
val[i][0]=i;
for (i=1;(1<<i)<=l;i++)
for (j=1;j+(1<<i)<=l;j++)
{
val[j][i]=val[j][i-1];
if (niv[val[j][i]]>niv[val[j+(1<<(i-1))][i-1]])
val[j][i]=val[j+(1<<(i-1))][i-1];
}
for (i=2;i<=l;i++)
lg[i]=lg[i/2]+1;
for (i=1;i<=m;i++)
{
f>>x>>y;
x=first[x],y=first[y];
if (x>y) swap(x,y);
dif=y-x+1;
dif=lg[dif];
ans=val[x][dif];
if (niv[val[y+1-(1<<dif)][dif]]<ans)
ans=val[y+1-(1<<dif)][dif];
g<<v[ans]<<'\n';
}
return 0;
}