Cod sursa(job #2977402)

Utilizator Vlad_NituNitu Vlad-Petru Vlad_Nitu Data 11 februarie 2023 15:36:58
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
//
// Created by Vlad Nitu on 11.02.2023.
//

#include <bits/stdc++.h>

using namespace std;

#define NMAX (int)(100002)
#define INF (int)(1e9)
#define ll long long
#define mkp make_pair
#define mkt make_tuple
#define lsb(x) (x & -x)


int N, Q;
int T[3 * NMAX];
int mn;

// A[pos] = val
void update(int pos, int val, int node = 1, int node_lb = 1, int node_ub = N) { // update(pos, val)
    if (node_lb == node_ub) T[node] = val;
    else {
        int mij = (node_lb + node_ub) / 2;

        if (pos <= mij)
            update(pos, val, node * 2, node_lb, mij);
        else
            update(pos, val, node * 2 + 1, mij + 1, node_ub);

        T[node] = min(T[node * 2], T[node * 2 + 1]);
    }
}

// min(a[i]), i in [a,b]
int query(int a, int b, int node = 1, int node_lb = 1, int node_ub = N) { // query(a, b)

    if (a <= node_lb && b >= node_ub) mn = min(mn, T[node]);
    else {
        int mid = (node_lb + node_ub) / 2;
        if (a <= mid)
            query(a, b, node * 2, node_lb, mid);
        if (b >= mid + 1)
           query(a, b, node * 2 + 1, mid + 1, node_ub);
    }
}

int x;
int a, b;

int main() {

    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);


    cin.tie(nullptr);
    cin.sync_with_stdio(false);

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

    for (int i = 1; i <= N; ++i) {
        scanf("%d", &x);
        update(i, x); // A[i] = x
    }

    while (Q--) {
        scanf("%d %d", &a, &b);
        mn =  INT_MAX;
        query(a, b);
        printf("%d\n", mn);
    }

    return 0;
}