Pagini recente » Cod sursa (job #2300406) | Cod sursa (job #999356) | Cod sursa (job #2250574) | Cod sursa (job #1263796) | Cod sursa (job #1804726)
#include <stdio.h>
#include <math.h>
#define MAXN 100000
#define MAXL 20
int tata[MAXN],euler[4 * MAXN],M2[MAXN][MAXL],level[4 * MAXN],poz[MAXN],n;
long long m;
void euleer(int nod){
int i;
++m;
euler[m] = nod;
level[m] = level[m - 1] + 1;
poz[nod] = m;
for(i = 1;i <= n; ++i){
if(tata[i] == nod){
euleer(i);
++m;
euler[m] = nod;
level[m] = level[m - 1] - 1;
}
}
}
void creare_rmq(int M2[MAXN][MAXL]){
int i, j;
for(i = 0;i < m; ++i)
M2[i][0] = i;
for(j = 1;(1 << j) <= m; ++j)
for(i = 0;i + (1 << j) - 1 < m; ++i)
if(euler[M2[i][j - 1]] < euler[M2[i + (1 << (j - 1))][j - 1]])
M2[i][j] = M2[i][j - 1];
else
M2[i][j] = M2[i + (1 << (j - 1))][j - 1];
}
int rezultat(int i,int j,int M2[MAXN][MAXL]){
int k;
k = log2(j - i + 1);
return min(euler[M2[i][k]],euler[M2[j - (1 << k) + 1][k]]);
}
int min(int i,int j){
if(i > j)
return j;
return i;
}
int main(){
FILE *f, *g;
f=fopen("lca.in","r");
g=fopen("lca.out","w");
int i, x, t,a ,b, nivel = 1, aux, j, c, d;
fscanf(f,"%d %d",&n,&t);
tata[1] = 0;
level[0] = -1;
for(i = 1;i < n; ++i)
fscanf(f,"%d",&tata[i + 1]);
euleer(1);
creare_rmq(M2);
for(i = 1;i <= t; ++i){
fscanf(f,"%d %d",&a,&b);
c = poz[a];
d = poz[b];
if(c > d){
aux = c;
c = d;
d = aux;
}
fprintf(g,"%d\n",rezultat(c,d,M2));
}
return 0;
}