Cod sursa(job #2676670)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 24 noiembrie 2020 19:11:12
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define NMAX 100002
#define INF 0x3f3f3f3f

long int aint[NMAX * 3 + 1];
long int rez;

void update(long int nod, long int st, long int dr, long int poz, long int val) {
    if (st == dr) {
        aint[nod] = val;
    } else {
        long int mid = (st + dr) / 2;

        if (poz <= mid){
            update(2 * nod, st, mid, poz, val);
        } else {
            update(2 * nod + 1, mid + 1, dr, poz, val);
        }

        aint[nod] = min(aint[2 * nod], aint[2 * nod + 1]);
    }
}

void query(long int nod, long int st, long int dr, long int a, long int b) {
    if (a <= st && dr <= b){
        rez = min(rez, aint[nod]);
    } else {
        long int mid = (st + dr) / 2;

        if (a <= mid) {
            query(2 * nod, st, mid, a, b);
        }

        if (b > mid) {
            query(2 * nod + 1, mid + 1, dr, a, b);
        }
    }
}

int main() {
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);

    int N, M;
    long int x, y;

    scanf("%d %d", &N, &M);

    for (int i = 1 ; i <= N ; i++) {
        scanf("%ld", &x);
        update(1, 1, N, i, x);
    }

    for (int i = 1 ; i <= M ; i++) {
        scanf("%ld %ld", &x, &y);

        rez = INF;
        query(1, 1, N, x, y);
        printf("%ld\n", rez);
    }
    
    return 0;
}