Pagini recente » Cod sursa (job #147727) | Cod sursa (job #2273119) | Cod sursa (job #1501181) | Cod sursa (job #872503) | Cod sursa (job #630187)
Cod sursa(job #630187)
#include <fstream>
#define log2(n) 31-__builtin_clz(n)
#define N 100010
using namespace std;
struct node {
int data;
node * next;
};
node * arb [N],*k;
int n,m,i,j,fa[2*N],e[2*N],a[2*N],b[19][2*N],ul,o,lg,M;
void pe (int k,int n) {
e[i++]=n;
if (!fa[k]) fa[k]=i;
a[i-1]=k;
node *t=arb[k];
while (t) {
pe (t->data,n+1);
e[i++]=n;
a[i-1]=k;
t=t->next;
}
}
int main () {
ifstream in ("lca.in");
ofstream out ("lca.out");
in>>n>>m;
M=(n<<1)-1;
for (i=0; i<n-1; i++) {
in>>j;
k=new node;
k->data=i+2;
k->next=arb[j];
arb[j]=k;
}
i=0;
pe (1,0);
for (i=0; i<M; i++) b[0][i]=i;
lg=log2(M);
for (i=1,o=1; i<=lg; i++,o<<=1) {
ul=M-o;
for (j=0; j<=ul; j++)
if (e[b[i-1][j]]<e[b[i-1][j+o]]) b[i][j]=b[i-1][j];
else b[i][j]=b[i-1][j+o];
}
for (;m;m--) {
in>>i>>j;
i=fa[i]-1;
j=fa[j]-1;
if (j-i<0) { n=i; i=j; j=n; }
n=log2(j-i+1);
if (e[b[n][i]]<e[b[n][j-(1<<n)+1]]) lg=b[n][i];
else lg=b[n][j-(1<<n)+1];
out<<a[lg]<<"\n";
}
return 0;
}