Pagini recente » Cod sursa (job #3355378) | Cod sursa (job #1818355) | Cod sursa (job #3307670) | Cod sursa (job #3356004) | Cod sursa (job #3346161)
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <algorithm>
#include <vector>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC
using namespace std;
char BUF[LIM];
int poz;
inline char getChar(){
poz++;
if(poz>=LIM){
fread(BUF,LIM,1,stdin);
poz=0;
}
return BUF[poz];
}
inline int getNr(){
int r=0, semn=1;
char ch=getChar();
while(isdigit(ch)==0 && ch!='-') ch=getChar();
if(ch=='-'){
semn=-1;
ch=getChar();
}
while(isdigit(ch)!=0){
r=r*10+semn*(ch-'0');
ch=getChar();
}
return r;
}
vector <int> L[100001];
int f[100001],euler[200001],level[200001] ,nr,ap[100001],lg2[200001];
pair <int, int> rmq[200001][18];
void dfs(int i, int lev)
{
f[i]=1;
euler[++nr]=i;
level[nr] = lev;
for(auto it : L[i])
if(!f[it])
{
dfs(it, lev + 1);
euler[++nr]=i;
level[nr] = lev;
}
}
int main()
{
int n,m,i,x,y,p2,ct,a,b;
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
n=getNr();
m=getNr();
for(i=2; i<=n; i++)
{
x=getNr();
L[x].push_back(i);
L[i].push_back(x);
}
dfs(1, 1);
for(i=1; i<=nr; i++)
if(!ap[euler[i]])
ap[euler[i]]=i;
for(i=1; i<=nr; i++)
rmq[i][0]={level[i], euler[i]};
for(ct=1; (1<<ct)<=nr; ct++)
for(i=(1<<ct); i<=nr; i++)
if(rmq[i][ct-1].first < rmq[i-(1<<(ct-1))][ct-1].first)
rmq[i][ct] = rmq[i][ct-1];
else
rmq[i][ct] = rmq[i-(1<<(ct-1))][ct-1];
for(i=2; i<=nr; i++)
lg2[i]=lg2[i/2]+1;
while(m--)
{
x=getNr();
y=getNr();
a=min(ap[x],ap[y]);
b=max(ap[x],ap[y]);
if(rmq[a+(1<<lg2[b-a+1])-1][lg2[b-a+1]].first < rmq[b][lg2[b-a+1]].first)
printf("%d\n",rmq[a+(1<<lg2[b-a+1])-1][lg2[b-a+1]].second);
else
printf("%d\n",rmq[a+(1<<lg2[b-a+1])-1][lg2[b-a+1]].second);
}
return 0;
}