Pagini recente » Cod sursa (job #732467) | Cod sursa (job #1898426) | Cod sursa (job #842680) | Cod sursa (job #2087853) | Cod sursa (job #408801)
Cod sursa(job #408801)
#include <stdio.h>
#include <vector>
#define Nmax 100005
using namespace std;
vector <int> A[Nmax];
int e[Nmax], N[2 * Nmax], log[2 * Nmax], EULER[2*Nmax], RMQ[20][2*Nmax];
int i, n, m, x, k = 1, y, q, aux;
#define minim(a,b) N[a]<N[b] ? a : b
FILE * f = fopen ("lca.in", "r");
FILE * g = fopen ("lca.out", "w");
void citire(){
fscanf(f, "%d %d", &n, &m);
for (i = 1 ; i < n ; i++){
fscanf(f, "%d", &x);
A[x].push_back(i+1);
}
}
void dfs(int nod, int niv){
int i, l;
l = A[nod].size();
EULER[++k]=nod;
N[k]=niv;
e[nod]=k;
for (i = 0 ; i < l ; i++){
x=A[nod][i];
dfs(x, niv+1);
N[++k] = niv;
EULER[k] = nod;
}
}
void logaritm(){
n = k;
RMQ[0][1] = 1;
for (i = 2 ; i <= n ; i++){
log[i] = log[i>>1] + 1;
RMQ[0][i] = i;
}
}
void preprocesare(){
for (k = 1 ; (1<<k) <= n ; k++){
aux = (1<<k) - 1;
for (i = 1 ; i + aux <= n ; i++)
RMQ[k][i] = minim( RMQ[k-1][i], RMQ[k-1][i + (1<<k-1)] );
}
}
void rezolvare(){
for (i = 1 ; i <= m ; i++){
fscanf (f, "%d %d", &x, &y);
x = e[x];
y = e[y];
if (y < x){
aux = x;
x = y;
y = aux;
}
q = log [y-x+1];
fprintf (g, "%d\n", EULER[minim(RMQ[q][x], RMQ[q][y - (1<<(q)) + 1])]);
}
}
int main(){
citire();
N[1] = 0;
EULER[1] = 1;
dfs(1,1);
logaritm();
preprocesare();
rezolvare();
fclose(f);
fclose(g);
return 0;
}