Cod sursa(job #2575106)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 6 martie 2020 11:40:43
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, q, lInt;
int v[100001], interv[330];

int main() {
    fin >> n >> q;
    lInt = sqrt(n);

    for (int i = 1; i <= lInt + 1; i++)
        interv[i] = 2000000000;

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

        int coresp = i / lInt;
        if (i % lInt != 0)
            coresp++;

        interv[coresp] = min(interv[coresp], v[i]);
    }

    while (q--) {
        int a, b;
        int intIn, intSf, minim = 2000000000;

        fin >> a >> b;

        if (a % lInt == 1)
            intIn = a / lInt + 1;
        else {
            intIn = a / lInt + 1;
            if (a % lInt != 0)
                intIn++;

            int sf = lInt * (intIn - 1); /// elemente extra in stanga
            for (int i = a; i <= sf; i++)
                minim = min(minim, v[i]);
        }

        if (b % lInt == 0)
            intSf = b / lInt;
        else {
            intSf = b / lInt;

            int in = lInt * intSf + 1; /// elemente extra in dreapta
            for (int i = in; i <= b; i++)
                minim = min(minim, v[i]);
        }

        for (int i = intIn; i <= intSf; i++) /// intervalele incluse
            minim = min(minim, interv[i]);

        fout << minim << '\n';
    }
    return 0;
}