Cod sursa(job #3155104)

Utilizator andreidumitrache1709Dumitrache Andrei Bogdan andreidumitrache1709 Data 7 octombrie 2023 12:51:02
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <iostream> // Add this include for std::min function

using namespace std;
#define MAXN 100000
int sp[MAXN + 1][MAXN + 1];
int a[MAXN + 1];
int lg[MAXN + 1];

void buildSparseTable(int a[], int n) {
    int k, i, j;
    for (i = 0; i < n; i++)
        sp[i][0] = a[i];
    k = lg[n];
    for (j = 1; j <= k; j++) {
        for (i = 0; (i + (1 << j)) - 1 < n; i++) {
            sp[i][j] = min(sp[i][j - 1], sp[i + (1 << (j - 1))][j - 1]);
        }
    }
}

int query (int i, int j) {
    int k, len;
    len = j - i + 1;
    k = lg[j - i + 1];
    return min(sp[i][k], sp[i + len - (1 << k)][k]);
}

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    int n, q, i, j, x, y;
    fin >> n >> q;
    for (i = 2; i <= MAXN; i++)
        lg[i] = 1 + lg[i / 2];
    for (i = 0; i < n; i++)
        fin >> a[i];
    buildSparseTable(a, n);
    for (i = 0; i < q; i++) {
        fin >> x >> y;
        x--;
        y--;
        fout << query(x, y) << '\n';
    }
    return 0;
}