Cod sursa(job #2973018)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 30 ianuarie 2023 20:39:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
using namespace std;

const int dmax = 100001;

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

int v[dmax];
int log2[dmax]; // lg[i] = valoarea lui log2(i)
int rmq[18][dmax]; // rmq[i][j] = valoarea minima dintr-un interval de lungime 2^i care se termina pe pozitia j

int main()
{
    int n, q, i, j, l, a, b;

    in >> n >> q;
    for (i = 1; i <= n; i++) {
        in >> v[i];
    }

    // formare vector log2
    log2[1] = 0; //log2(1) = 0
    for (i = 2; i <= n; i++) {
        log2[i] = log2[i/2] + 1; // log2(a*b) = log2(a) + log2(b), unde a = i/2 si b = 2
    }

    // rmq
    for (j = 1; j <= n; j++) {
        // valoarea minima dintr-un interval de lungime 1 care se termina pe pozitia j
        // este practic intervalul [j,j] -> element minim = v[j]
        rmq[0][j] = v[j];
    }

    for (i = 1; i <= log2[n]; i++) {
        for (j = 1; j <= n; j++) {
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j - (1 << (i - 1))]);
        }
    }

    // for (i = 0; i <= log2[n]; i++) {
    //     for (j = 1; j <= n; j++) {
    //         cout << rmq[i][j] << " ";
    //     }
    //     cout << "\n";
    // }

    for (i = 1; i <= q; i++) {
        in >> a >> b;
        l = log2[b - a + 1];
        out << min(rmq[l][b], rmq[l][a + (1 << l) - 1]) << "\n";
    }

    return 0;
}