Pagini recente » Cod sursa (job #3204222) | Cod sursa (job #351418) | Cod sursa (job #1522892) | Cod sursa (job #2029961) | Cod sursa (job #2352091)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int i,j,m,poz,n,x,y,b,lg[300003],t[200005],h[200005],a[100003];
// h= nivelul nodului i in parcurgere
// t= parcurgerea lui euler
// a=prima aparitie a nodilui i in parcurgere
// r= tabelul de rmq
vector<int> f[100001];
struct abc
{
int v,pz;
}r[18][100003];
void eul(int nod,int H)
{
i++;
t[i]=nod;
h[i]=H;
if (!a[nod]) a[nod]=i;
int l=f[nod].size();
for (int j=0;j<l;j++)
{eul(f[nod][j],H+1);
h[++i]=H; t[i]=nod;}
}
int main()
{
fin>>n>>m;
for (i=2;i<=n;i++)
{
fin>>x;
f[x].push_back(i);
}
i=0;
eul(1,0);
poz=i;
for (i=1;i<=poz;i++)
{r[0][i].v=h[i]; r[0][i].pz=t[i];}
for (i=2;i<=n*3;i++) lg[i]=lg[i/2]+1;
for (i=1;(1 << i)<=poz;i++)
for (j=1;j+(1<<i)-1<=poz;j++)
if (r[i-1][j].v<r[i-1][j+(1<<(i-1))].v)
r[i][j]=r[i-1][j];
else r[i][j]=r[i-1][j+(1<<(i-1))];
for (i=1;i<=m;i++)
{
fin>>x>>y;
x=a[x];
y=a[y];
if (y<x) swap(x,y);
int z=lg[y-x];
if (r[z][x].v<r[z][y-(1<<z)].v) fout<<r[z][x].pz<<"\n"; else fout<<r[z][y-(1<<z)].pz<<"\n";
}
return 0;
}