Pagini recente » Cod sursa (job #1628885) | Cod sursa (job #3170262) | Cod sursa (job #1209495) | Cod sursa (job #2570548) | Cod sursa (job #2850868)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int nmax=100000, nmax2=17;
vector <int> g[nmax+1];
int v[nmax2+1][2*nmax], lg[2*nmax], pv[nmax+1], l[nmax+1];
int poz=0;
void dfs(int x){
poz++;
v[0][poz]=x;
pv[x]=poz;
for(int i=0;i<int(g[x].size());i++){
int xn=g[x][i];
l[xn]=l[x]+1;
dfs(xn);
poz++;
v[0][poz]=x;
}
}
int main(){
int n,m;
fin>>n>>m;
for(int i=2;i<=n;i++){
int x;
fin>>x;
g[x].push_back(i);
}
l[1]=1;
dfs(1);
for(int i=2;i<=2*nmax-1;i++){
lg[i]=lg[i/2]+1;
}
n=poz;
for(int i=1;i<=lg[n];i++){
for(int j=1;j<=n-(1<<i)+1;j++){
if(l[v[i-1][j]]<l[v[i-1][j+(1<<(i-1))]]){
v[i][j]=v[i-1][j];
}else{
v[i][j]=v[i-1][j+(1<<(i-1))];
}
}
}
for(int i=1;i<=m;i++){
int x,y;
fin>>x>>y;
x=pv[x];
y=pv[y];
if(x>y){
int aux=x;
x=y;
y=aux;
}
int log2=lg[y-x+1];
if(l[v[log2][x]]<l[v[log2][y-(1<<log2)+1]]){
fout<<v[log2][x]<<"\n";
}else{
fout<<v[log2][y-(1<<log2)+1]<<"\n";
}
}
return 0;
}