Pagini recente » Cod sursa (job #2625903) | Cod sursa (job #254615) | Cod sursa (job #2987608) | Cod sursa (job #2454356) | Cod sursa (job #611023)
Cod sursa(job #611023)
#include <cstdio>
#include <fstream>
#include <vector>
using namespace std;
#define N 200001
vector<int> v[100001];
int n,m,k,i,l,j,L[N],h[N],lg[N],F[100001],rmq[32][N<<1];
void df (int nd,int lv){
h[++k]=nd;
L[k]=lv;
F[nd]=k;
for(vector<int>::iterator it=v[nd].begin();it<v[nd].end();++it){
df(*it,lv+1);
h[++k]=nd;
L[k]=lv;}}
inline int lca (int x,int y){
int a=F[x],b=F[y],sol,s,dif;
if(a>b)
swap(a,b);
dif=b-a+1;
l=lg[dif];
sol=rmq[l][a];
s=dif-(1<<l);
if(L[sol]>L[rmq[l][a+s]])
sol=rmq[l][a+s];
return h[sol];}
int main ()
{
ifstream f ("lca.in");
freopen ("lca.out","w",stdout);
f>>n>>m;
for(i=2;i<=n;++i){
f>>j;
v[j].push_back(i);}
df(1,0);
rmq[0][1]=1;
for(i=2;i<=k;++i){
lg[i]=lg[i>>1]+1;
rmq[0][i]=i;}
for(i=1;(1<<i)<k;++i)
for(j=1;j+(1<<i)<=k;++j){
l=1<<(i-1);
rmq[i][j]=rmq[i-1][j];
if(L[rmq[i-1][j+l]]<L[rmq[i][j]])
rmq[i][j]=rmq[i-1][j+l];}
for(;m;--m){
f>>i>>j;
printf("%d\n",lca(i,j));}
return 0;}