Cod sursa(job #2977394)

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

#include <bits/stdc++.h>

using namespace std;

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


int N, Q;
vector<int> T;

// 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)
    int minLeft = INT_MAX / 2, minRight = INT_MAX / 2;


    if (a <= node_lb && b >= node_ub) return T[node];
    else {
        int mid = (node_lb + node_ub) / 2;

        if (a <= mid)
            minLeft = query(a, b, node * 2, node_lb, mid);
        if (b >= mid + 1)
            minRight = query(a, b, node * 2 + 1, mid + 1, node_ub);

        return min(minLeft, minRight);
    }
}

int x;
int a, b;

int main() {

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


    cin >> N >> Q;
    T = vector<int>(4 * N + 1, INT_MAX / 2);

    for (int i = 1; i <= N; ++i) {
        cin >> x;
        update(i, x); // A[i] = x
    }

    while (Q--) {
        cin >> a >> b;
        cout << query(a, b) << '\n';
    }

    return 0;
}