Pagini recente » Cod sursa (job #2119841) | Cod sursa (job #236882) | Cod sursa (job #1364636) | Cod sursa (job #911892) | Cod sursa (job #2392525)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int>v[100005];
int n,m,nr,d[500005][20],a,b,k,x,ad[500005],y;
long long p[100005],euler[500005];
void df(int o,int a)
{
nr++;
euler[nr]=o;
if(p[o]==0) p[o]=nr;
ad[nr]=a;
for(int i=0;i<v[o].size();i++)
{
df(v[o][i],a+1);
nr++;
ad[nr]=a;
euler[nr]=o;
if(p[o]==0) p[o]=nr;
}
}
int main()
{
int i,j;
f>>n>>m;
for(i=1;i<n;i++)
{
f>>x;
v[x].push_back(i+1);
}
df(1,0);
for(i=1;i<=nr;i++) d[i][0]=euler[i];
for(j=1;(1<<j)<=nr;j++)
for(i=1;i+(1<<j)-1<=nr;i++)
{
if(ad[p[d[i][j-1]]]<ad[p[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(i=1;i<=m;i++)
{
f>>x>>y;
a=p[min(x,y)];
b=p[max(x,y)];
k=log2(b-a+1);
if(ad[p[d[a][k]]]<ad[p[d[b-(1<<k)+1][k]]]) g<<d[a][k]<<'\n';
else g<<d[b-(1<<k)+1][k]<<'\n';
}
return 0;
}