Cod sursa(job #2821710)

Utilizator stefandutastefandutahoria stefanduta Data 22 decembrie 2021 21:48:21
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <cstring>
#define NMAX 100005
#define sq 360
#define NR_MAX 1000005

using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");

int n, m, i, j, a, b;
int v[NMAX];
int batog[360];

void setIO()
{
    ios_base::sync_with_stdio(false);
    in.tie(NULL);
    out.tie(NULL);
}

int query(int a, int b)
{
    int rez = NR_MAX;
    int firstinterval = (a + sq - 1) / sq * sq;
    int lastinterval = b / sq * sq;

    while (a <= b && a < firstinterval)
        rez = min(rez, v[a++]);
    while (a <= b && b >= lastinterval)
        rez = min(rez, v[b--]);

    firstinterval = firstinterval / sq;
    lastinterval = lastinterval / sq;

    while (firstinterval < lastinterval)
        rez = min(rez, batog[firstinterval++]);

    return rez;
}

int main()
{
    setIO();
    in >> n >> m;
    memset(batog, NR_MAX, sizeof(batog));
    for (i = 0; i < n; ++i)
    {
        in >> v[i];
        batog[i / sq] = min(batog[i / sq], v[i + 1]);
    }

    for (i = 1; i <= m; ++i)
    {
        in >> a >> b;
        out << query(a - 1, b - 1) << '\n';
    }
    return 0;
}