Pagini recente » Cod sursa (job #685122) | Cod sursa (job #141739) | Cod sursa (job #1212668) | Cod sursa (job #1975144) | Cod sursa (job #630204)
Cod sursa(job #630204)
#include <fstream>
#include <stack>
#define log2(n) 31-__builtin_clz(n)
#define N 100010
using namespace std;
stack<int> arb[N];
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) {
a[i]=k;
e[i++]=n;
if (!fa[k]) fa[k]=i;
while (!arb[k].empty ()) {
pe (arb[k].top (),n+1);
a[i]=k;
e[i++]=n;
arb[k].pop ();
}
}
int main () {
ifstream in ("lca.in");
ofstream out ("lca.out");
in>>n>>m;
M=(n<<1)-1;
for (i=1; i<n; i++) {
in>>j;
arb[j].push (i+1);
}
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];
}
while (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;
}