Pagini recente » Cod sursa (job #1750074) | Cod sursa (job #2813209) | Cod sursa (job #2593078) | Cod sursa (job #2096194) | Cod sursa (job #2392513)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[100001];
long long nr,p[200010],e[200010];
int n,m,i,x,d[5000010][25],j,q,a,b,ad[500010],y;
void df(int o,int a)
{
nr++;
int i;
ad[nr]=a;
if(p[o]==0)p[o]=nr;
e[nr]=o;
for(i=0;i<v[o].size();i++)
{
df(v[o][i],a+1);
nr++;
ad[nr]=a;
e[nr]=o;
}
}
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
df(1,0);
for(i=1;i<=nr;i++)
{
d[i][0]=e[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+(1<<(j-1))][j-1];
else d[i][j]=d[i][j-1];
}
}
for(q=1;q<=m;q++)
{ f>>x>>y;
if (p[x]>p[y]) swap(x,y);
int k=log2(p[y]-p[x]+1);
if (ad[p[d[p[x]][k]]]>ad[p[d[p[y]-(1<<k)+1][k]]])
g<<d[p[y]-(1<<k)+1][k]<<'\n';
else g<<d[p[x]][k]<<'\n';
}
return 0;
}