Pagini recente » Cod sursa (job #2663855) | Cod sursa (job #2432256) | Cod sursa (job #1546762) | Cod sursa (job #1400507) | Cod sursa (job #2771819)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<vector<int>>a;
int nr,n,m,vmin[200010][25],rp[25],p[200010],x,y,t[100010],niv[200010],f[100010],v[200010];
void lca(int val,int b)
{
niv[++nr]=b;
f[val]=nr;
v[nr]=val;
for(auto p:a[val])
{
lca(p,b+1);
niv[++nr]=b;
v[nr]=val;
}
return;
}
int main()
{
in>>n>>m;
a.resize(n+5);
for(int i=2;i<=n;++i)
{
in>>t[i];
a[t[i]].push_back(i);
}
rp[0]=1;
n*=2;
--n;
lca(1,1);
for(int i=1;i<=18;++i)
{
rp[i]=rp[i-1]*2;
if(i<18)
p[rp[i]]=i;
}
for(int i=1;i<=n;++i)
{
vmin[i][0]=i;
if(p[i]==0)
p[i]=p[i-1];
}
for(int j=1;rp[j]<=n;++j)
{
for(int i=1;i+rp[j]-1<=n;++i)
if(niv[vmin[i][j-1]]<niv[vmin[i+rp[j-1]][j-1]])
vmin[i][j]=vmin[i][j-1];
else
vmin[i][j]=vmin[i+rp[j-1]][j-1];
}
for(int i=1;i<=m;++i)
{
in>>x>>y;
x=f[x];
y=f[y];
if(y<x)
swap(x,y);
if(niv[vmin[x][p[y-x+1]]]<niv[vmin[y-rp[p[y-x+1]]+1][p[y-x+1]]])
out<<v[vmin[x][p[y-x+1]]]<<'\n';
else
out<<v[vmin[y-rp[p[y-x+1]]+1][p[y-x+1]]]<<'\n';
}
return 0;
}