Cod sursa(job #3366658)

Utilizator llaris_a23Larisa Alexandra Videnie llaris_a23 Data 3 octombrie 2026 11:18:30
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n, m, a, b;
int v[100002], rmq[100002][30], put[100002];

int main() {

    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> v[i];

        for (int j = 0; j < 30; j++) {
            rmq[i][j] = 1e9;
        }
    }

    put[1] = 0;
    put[2] = 1;

    int p = 2, cnt = 1;

    for (int i = 3; i <= n; i++) {

        if (p * 2 <= i) {
            p *= 2;
            cnt++;
        }

        put[i] = cnt;
    }

    for (int j = 0, lg = 1; lg <= n; j++, lg *= 2) {
        for (int i = 1; i <= n - lg + 1; i++) {
            if (j == 0) {
                rmq[i][j] = v[i];
            }
            else {
                rmq[i][j] = min(rmq[i][j - 1], rmq[i + lg/2][j - 1]);
            }
        }
    }

    for (int i = 1; i <= m; i++) {
        fin >> a >> b;

        int x = put[b - a + 1];
        int ans = min(rmq[a][x], rmq[b - (1 << x) + 1][x]);

        fout << ans << "\n";
    }
}