Pagini recente » Cod sursa (job #1861766) | Cod sursa (job #3191370) | Cod sursa (job #945982) | Cod sursa (job #207496) | Cod sursa (job #2848187)
#include <fstream>
#include <cmath>
#include <vector>
#define pb push_back
#define Nmax 100100
#define PII pair<int,int>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int pr[Nmax];
PII rmq[32][Nmax];
vector <PII> parg;
vector <int> G[Nmax];
void euler(int nod,int niv);
inline void make_rmq();
int main()
{
int N,Q,x,y,px,py,lg,p2;
cin>>N>>Q;
for(int i=2; i<=N; ++i)
{
cin>>x;
G[x].pb(i);
}
parg.pb({0,0});
euler(1,1);
make_rmq();
PII ans;
for(int i=1; i<=Q; ++i)
{
cin>>x>>y;
px=pr[x]; py=pr[y];
lg=py-px+1;
p2=log2(lg);
ans=min(rmq[p2][px],rmq[p2][py-(1<<p2)+1]);
cout<<ans.second<<'\n';
}
return 0;
}
void euler(int nod,int niv)
{
parg.pb({nod,niv});
pr[nod]=parg.size()-1;
rmq[0][parg.size()-1]={niv,nod};
for(auto nn:G[nod])
if(!pr[nn])
{
euler(nn,niv+1);
parg.pb({nod,niv});
rmq[0][parg.size()-1]={niv,nod};
}
}
inline void make_rmq()
{
int sz=parg.size()-1;
for(int p2=1; (1<<p2)<=sz; ++p2)
for(int i=1; i<=sz-(1<<p2)+1; ++i)
rmq[p2][i]=min(rmq[p2-1][i],
rmq[p2-1][i+(1<<(p2-1))]);
}