Cod sursa(job #3281048)

Utilizator stanrares1002@gmail.comRares Stan [email protected] Data 28 februarie 2025 10:23:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define ll long long
#define NMAX 100005
#define INF 1000000000
#define MOD 666013

int n;
int v[NMAX], LOG[NMAX], dp[NMAX][20];

void prec_log() {
    LOG[1] = 0;
    for (int i = 2; i <= n; i++) LOG[i] = LOG[i / 2] + 1;
}

void rmq() {
    int x = LOG[n];
    /// dp[i][j] = min(dp[i][j - 1], dp[i + (1 << j)][j - 1]);
    for (int i = 1; i <= n; i++) dp[i][0] = v[i];

    for (int j = 1; j <= x; j++)
        for (int i = 1; i <= n - (1 << j) + 1; i++)
            dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}

int query(int x, int y) {
    int j = LOG[y - x + 1];
    return min(dp[x][j], dp[y - (1 << j) + 1][j]);
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");

    int q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> v[i];

    prec_log(), rmq();
    while (q--) {
        int x, y;
        cin >> x >> y;
        cout << query(x, y) << '\n';
    }
    return 0;
}