Cod sursa(job #3253801)

Utilizator TheodosiusOancea Teodor Stefan Theodosius Data 4 noiembrie 2024 20:59:03
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#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;
}