Pagini recente » Cod sursa (job #1550918) | Cod sursa (job #1867089) | Cod sursa (job #275700) | Cod sursa (job #1301020) | Cod sursa (job #2866725)
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream in ("lca.in");
ofstream out ("lca.out");
vector <int> v[100002];
long n,m,viz[200002],st[200002],a[200002],nr,b,d[200002][50];
void dfs(int nod)
{
a[++nr]=nod;
st[nod]=nr;
for(auto i:v[nod])
{
if(!viz[i])
viz[i]=viz[nod]+1,dfs(i),a[++nr]=nod;
}
}
int main()
{
in>>n>>m;
for(int i=2;i<=n;i++)
{
in>>b;
v[b].push_back(i);
}
viz[1]=1;
dfs(1);
for(int i=1;i<=nr;i++)
{
d[i][0]=a[i];
}
for(int j=1;(1<<j)<=nr;j++)
{
for(int i=1;i+(1<<j)-1<=nr;i++)
{
if(viz[d[i][j-1]]<viz[d[i+(1<<(j-1))][j-1]])d[i][j]=d[i][j-1];
else d[i][j]=d[i+(1<<(j-1))][j-1];
}
}
for(int k=1;k<=m;k++)
{
int x,y;
in>>x>>y;
x=st[x];
y=st[y];
if(x>y)swap(x,y);
int p=log2(y-x+1);
int cmin=min(d[x][p],d[y-(1<<p)+1][p]);
out<<cmin<<'\n';
}
return 0;
}