Pagini recente » Cod sursa (job #1616105) | Cod sursa (job #1458351) | Cod sursa (job #1665185) | Cod sursa (job #1369518) | Cod sursa (job #2565438)
#include <bits/stdc++.h>
#define dim 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int d[dim],i,t[31][dim],x,y;
vector <int> L[dim];
bitset<dim> fr;
void dfs(int nod){
fr[nod]=1;
for(auto it:L[nod]){
if(fr[it]==0){
d[it]=d[nod]+1;
dfs(it);
}
}
}
int verif(int x,int dx){
int put=0;
int ta=x;
// cout<<x<<" "<<dx<<" ";
while(dx){
if(dx%2==1){
ta=t[put][ta];
}
put++;
dx/=2;
}
return ta;
}
void query(int x,int y){
int lx=d[x];
int ly=d[y];
int st=0,dr=min(lx,ly)+1,mid;
while(st<=dr){
// cout<<st<<" "<<dr<<endl;
mid=(st+dr)/2;
if(verif(x,lx-mid)==verif(y,ly-mid))
st=mid+1;
else dr=mid-1;
}
fout<<verif(y,ly-dr)<<"\n";
}
int main()
{
fin>>n>>m;
for(i=2;i<=n;i++){
fin>>x; /// de lungime 2^0 de i
t[0][i]=x;
L[x].push_back(i);
L[i].push_back(x);
}
dfs(1);
int la=(1<<29);
for(int l=1;l<=29;l++){
//cout<<1;
int put=(1<<l);
for(int nod=1;nod<=n;nod++){
t[l][nod]=t[l-1][t[l-1][nod]];
}
}
for(i=1;i<=m;i++){
fin>>x>>y;
query(x,y);
}
}