Pagini recente » Cod sursa (job #1660711) | Cod sursa (job #1066678) | Cod sursa (job #759727) | Cod sursa (job #773575) | Cod sursa (job #2575218)
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 100002
using namespace std;
ifstream f("lca.in");
ofstream o("lca.out");
int n,q;
int a[20][nmax],niv[nmax],log[nmax];
vector<int> g[nmax];
void read(){
f >> n >> q;
for(int i=2;i<=n;++i){
f >> a[0][i];
g[a[0][i]].push_back(i);
}
}
void dfs(int x){
int l=g[x].size(),v;
for(int i=0;i<l;++i){
v=g[x][i];
if(a[0][x]!=v){
dfs(v);
niv[v]=niv[x]+1;
}
}
}
void precalc(){
int i;
dfs(1);
for(i=1;(1<<i)<=n;++i)
for(int j=1;j<=n;++j)
a[i][j]=a[i-1][a[i-1][j]];
for(i=2;i<=n;++i)
log[i]=log[i>>1]+1;
}
int lca(int x,int y){
int k;
if(niv[x]<niv[y]) swap(x,y);
while(niv[x]!=niv[y]){
k=log[niv[x]-niv[y]];
x=a[k][x];
}
if(x==y) return x;
for(int i=log[niv[x]];i>=0;--i){
if(a[i][x]!=a[i][y]){
x=a[i][x];
y=a[i][y];
}
}
return a[0][x];
}
void solve(){
int x,y;
while(q--){
f >> x >> y;
o << lca(x,y) << '\n';
}
}
int main()
{
read();
precalc();
solve();
return 0;
}