Pagini recente » Cod sursa (job #555292) | Cod sursa (job #601606) | Cod sursa (job #3125471) | Cod sursa (job #1309132) | Cod sursa (job #1506237)
#include <fstream>
#define dim1 100005
#define dim2 200005
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int d[20][dim2],p[dim2],i,j,n,m,x,nr,first[dim2],NIV[dim2],A,B,a,b,P,S[dim2];
vector <int>v[dim2];
void dfs(int nod,int niv){
nr++;
S[nr]=nod;
NIV[nr]=niv;
first[nod]=nr;
for(int i=0;i<v[nod].size();i++){
dfs(v[nod][i],niv+1);
nr++;
S[nr]=nod;
NIV[nr]=niv;
}
}
int main(){
fin>>n>>m;
for(i=2;i<=n;i++){
fin>>x;
v[x].push_back(i);
}
dfs(1,1);
for(i=2;i<=nr;i++){
p[i]=p[i/2]+1;
}
for(i=1;i<=nr;i++){
d[0][i]=i;
}
for(i=1;i<=p[nr]+1;i++){
for(j=1;j<=nr;j++){
d[i][j]=d[i-1][j];
if(NIV[d[i-1][j]]>NIV[d[i-1][j+(1<<(i-1))]]){
d[i][j]=d[i-1][j+(1<<(i-1))];
}
}
}
for(i=1;i<=m;i++){
fin>>a>>b;
A=first[a];
B=first[b];
if(A>B){
swap(A,B);
}
P=p[B-A+1];
fout<<S[min(d[P][A],d[P][B-(1<<P)+1])]<<"\n";
}
return 0;
}