Cod sursa(job #3134107)

Utilizator SabinaEEnache Sabina-Anca SabinaE Data 28 mai 2023 15:06:13
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

int rmq[100000][17], n, m,x,y;

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


void citire() {
    for (int i = 0; i < n; i++) {
        f >> rmq[i][0];
    }
}

void RMQ() {
    for (int i = 1; i <= int(log2(n)); i++) {
        for (int j = 0; j < n - int(pow(2, i - 1)); j++) {
            int stanga = rmq[j][i - 1], dreapta = rmq[j + int(pow(2, i - 1))][i - 1];
            if (stanga < dreapta) {
                rmq[j][i] = stanga;
            }
            else {
                rmq[j][i] = dreapta;
            }
        }
    }
}

int query(int a, int b) {
    int l = b - a + 1;

    int index = int(log2(l));

    int stanga = rmq[a][index], dreapta = rmq[b - int(pow(2, index)) + 1][index];

    if (stanga < dreapta ) {
        return stanga;
    }
    return dreapta;
}

int main() {
    f >> n >> m;

    citire();
    RMQ();

    for (int i = 0; i < m; i++) {
        f >> x >> y;
        x--;
        y--;
        g << query(x, y) << endl;
    }
    f.close();
    g.close();
}