Pagini recente » Cod sursa (job #2220228) | Cod sursa (job #2509192) | Cod sursa (job #2480874) | Cod sursa (job #3152317) | Cod sursa (job #2808575)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,x,ceau[200005],prim[200005],niv[200005],q;
vector <int> v[100005];
void dfs(int x,int nivel)
{
ceau[++q]=x;
if (prim[x]==0)
{
prim[x]=q;
}
niv[x]=nivel;
for (int i=0;i<v[x].size();i++)
{
dfs(v[x][i],nivel+1);
ceau[++q]=x;
}
}
int rmq[200005][20];
int lca(int x,int y)
{
if (x==y)
{
return x;
}
x=prim[x];
y=prim[y];
if (x>y)
{
swap(x,y);
}
int k=log2(y-x);
if (niv[rmq[y-(1<<k)+1][k]]<niv[rmq[x][k]])
{
return rmq[y-(1<<k)+1][k];
}
return rmq[x][k];
}
int i,lg,p,j;
int main()
{
f>>n>>m;
for (i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
dfs(1,1);
for (i=1;i<=q;i++)
{
rmq[i][0]=ceau[i];
}
lg=log2(q);
p=1;
for (i=1;i<=lg;i++)
{
for (j=1;j<=q-p;j++)
{
if (niv[rmq[j][i-1]]<niv[rmq[j+p][i-1]])
{
rmq[j][i]=rmq[j][i-1];
}
else
{
rmq[j][i]=rmq[j+p][i-1];
}
}
p=p*2;
}
for (i=1;i<=m;i++)
{
int x,y;
f>>x>>y;
g<<lca(x,y)<<'\n';
}
return 0;
}