Pagini recente » Cod sursa (job #3038382) | Cod sursa (job #224605) | Cod sursa (job #3131901) | Cod sursa (job #2206273) | Cod sursa (job #3253801)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#define min(a,b) ((a) < (b) ? (a) : (b))
int *aint, s, n;
// Actualizare valoare în arbore
void update(int ind, int val) {
ind += s - 1;
aint[ind] = val;
while (ind > 1) {
ind /= 2;
aint[ind] = min(aint[2 * ind], aint[2 * ind + 1]);
}
}
// Răspuns pentru intervalul [a, b]
int rasp(int a, int b) {
a += s - 1;
b += s - 1;
int r = INT_MAX;
while (a <= b) {
if (a % 2 == 1) {
r = min(r, aint[a]);
a++;
}
if (b % 2 == 0) {
r = min(r, aint[b]);
b--;
}
a /= 2;
b /= 2;
}
return r;
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int m, a, b;
scanf("%d %d", &n, &m);
// Calculăm dimensiunea segmentului de date (putere de 2 care acoperă n)
s = 1;
while (s < n) s *= 2;
// Alocăm memorie pentru arbore și inițializăm cu INT_MAX
aint = (int*)malloc(2 * s * sizeof(int));
for (int i = 0; i < 2 * s; i++) {
aint[i] = INT_MAX;
}
// Citim valorile vectorului și actualizăm arborele
for (int i = 0; i < n; i++) {
int val;
scanf("%d", &val);
update(i + 1, val); // actualizează la indexul i + 1
}
// Răspundem la fiecare interogare
for (int i = 0; i < m; i++) {
scanf("%d %d", &a, &b);
printf("%d\n", rasp(a, b));
}
// Eliberăm memoria
free(aint);
return 0;
}