Pagini recente » Cod sursa (job #584600) | Cod sursa (job #2379645) | Cod sursa (job #2536554) | Cod sursa (job #1661230) | Cod sursa (job #2272643)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int a[200005];
vector <int> v[100001];
bool viz[100005];
int poz[200005],q=0,nani[200005];
void dfs(int x,int niv)
{
int i;
viz[x]=1;
for (i=0;i<v[x].size();i++)
{
if (viz[v[x][i]]==0)
{
q++;
a[q]=niv;
nani[q]=x;
if (poz[x]==0)
{
poz[x]=q;
}
dfs(v[x][i],niv+1);
i=i;
}
}
q++;
a[q]=niv;
nani[q]=x;
if (poz[x]==0)
{
poz[x]=q;
}
}
int n,m,i,x,j,rmq[19][200003],lim,nr,y,st,dr,k;
int main()
{
f>>n>>m;
for (i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
v[i].push_back(x);
}
dfs(1,1);
for (i=1;i<=2*n-1;i++)
{
rmq[0][i]=i;
}
lim=2*n-1;
nr=log2(lim);
for (i=1;i<=lim;i++)
{
for (j=1;j<=lim-(1<<i)+1;j++)
{
if (a[rmq[i-1][j]]<=a[rmq[i-1][j+(1<<(i-1))]])
{
rmq[i][j]=rmq[i-1][j];
}
else
{
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
}
}
for (i=1;i<=m;i++)
{
f>>x>>y;
st=min(poz[x],poz[y]);
dr=max(poz[x],poz[y]);
k=log2(dr-st);
if (a[rmq[k][st]]<a[rmq[k][dr-(1<<k)+1]])
{
g<<nani[rmq[k][st]]<<'\n';
}
else
{
g<<nani[rmq[k][dr-(1<<k)+1]]<<'\n';
}
}
return 0;
}