Pagini recente » Cod sursa (job #2567664) | Cod sursa (job #1047751) | Cod sursa (job #2872048) | Cod sursa (job #2094136) | Cod sursa (job #473845)
Cod sursa(job #473845)
#include<fstream>
#include<vector>
using namespace std;
#define NMAX 100003
ifstream fi("lca.in");
vector<int> f[NMAX],euler;
int poz[NMAX],niv[NMAX],rmq[20][NMAX<<1],log[NMAX<<1],d[20];
int n,m,x,i,a,b,aux1,aux2;
void Euler(int nod, int nv) {
int i,s;
poz[nod]=euler.size();
euler.push_back(nod);
niv[nod]=nv;
for(i=0,s=f[nod].size();i<s;i++) {
Euler(f[nod][i],nv+1);
euler.push_back(nod);
}
}
void calcD() {
d[0]=1;
for(int i=1;i<20;i++) d[i]=d[i-1]<<1;
}
void calcLog() {
int i,j=1,s=euler.size();
for(i=1;i<s;i++) {
if(i==d[j]) j++;
log[i]=j-1;
}
}
void preRMQ() {
int i,j,s,aux1,aux2;
for(i=0,s=euler.size();i<s;i++) rmq[0][i]=euler[i];
for(i=1;d[i]<=s;i++)
for(j=0;j<=s-d[i];j++) {
aux1=rmq[i-1][j];
aux2=rmq[i-1][j+d[i-1]];
if(niv[aux1]<niv[aux2])
rmq[i][j]=aux1;
else rmq[i][j]=aux2;
}
}
int RMQ(int a, int b) {
int aux1=log[b-a+1];
int aux2=rmq[aux1][a];
int best=aux2;
a+=d[aux1];
while(a<=b) {
if(niv[aux1]<niv[best]) best=aux2;
a+=d[aux1];
aux1=log[b-a+1];
aux2=rmq[aux1][a];
}
return best;
}
int main() {
fi>>n>>m;
for(i=2;i<=n;i++) {
fi>>x;
f[x].push_back(i);
}
Euler(1,1);
calcD();
calcLog();
preRMQ();
freopen("lca.out","w",stdout);
while(m--) {
fi>>a>>b;
aux1=poz[a];
aux2=poz[b];
if(aux1>aux2) swap(aux1,aux2);
printf("%d\n",RMQ(aux1,aux2));
}
return 0;
}