Pagini recente » Cod sursa (job #840673) | Cod sursa (job #2323182) | Cod sursa (job #2716277) | Cod sursa (job #92301) | Cod sursa (job #769480)
Cod sursa(job #769480)
#include<fstream>
#include<vector>
#define dim 100007
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int eul[3*dim],pr[dim],A[3*dim][20];
int i,j,n,m,x,y,k,pow[3*dim],w;
vector<int>G[dim];
void dfs(int nod) {
eul[++k]=nod;
pr[nod]=k;
for(int i=0;i<G[nod].size();++i){
dfs(G[nod][i]);
eul[++k]=nod;
}
}
int min(int a ,int b){
if(a<b)
return a;
return b;
}
int main () {
f>>n>>m;
for(i=2;i<=n;i++){
f>>x;
G[x].push_back(i);
}
dfs(1);
for(i=2;i<=k;++i)
pow[i]=pow[i/2]+1;
for(i=1;i<=k;i++){
A[i][0]=eul[i];
}
for(i=1; (1<<i)<=k; ++i ) {
for(j=1; j+(1<<i)-1<=k ;++j){
A[j][i]=min(A[j][i-1],A[j+(1<<(i-1))][i-1]);
}
}
for (i=1;i<=m;i++){
f>>x>>y;
x=pr[x];
y=pr[y];
if(x>y)
swap(x,y);
w=pow[y-x+1];
g<<min(A[x][w],A[y-(1<<w)+1][w])<<"\n";
}
return 0;
}