Pagini recente » Cod sursa (job #2449969) | Monitorul de evaluare | Monitorul de evaluare | Profil C_Ovidiu | Cod sursa (job #2001076)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> v[100010];
int n,m,lg,st,mi,dr,i,x,y,k,lev[100010],pa[100010],rmq[20][200030];
void euler(int nod)
{
rmq[0][++k]=nod;
pa[nod]=k;
for(auto it:v[nod])
{
lev[it]=lev[nod]+1;
euler(it);rmq[0][++k]=nod;
}
}
int main()
{
f>>n>>m;lev[1]=1;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}euler(1);
for(i=1,lg=2;lg<=k;i++,lg<<=1)
for(st=1,mi=lg/2+1,dr=lg;dr<=k;st++,mi++,dr++)
{
int ns=rmq[i-1][st],nm=rmq[i-1][mi];
rmq[i][st]=lev[ns]<lev[nm]?ns:nm;
}
for(;m;m--)
{
f>>x>>y;
x=pa[x];y=pa[y];
if(x>y)swap(x,y);
int lin=31-__builtin_clz(y-x+1);
lg=1<<lin;x=rmq[lin][x];
y=rmq[lin][y-lg+1];
g<<(lev[x]<lev[y]?x:y)<<'\n';
}
return 0;
}