Cod sursa(job #2850301)

Utilizator Avram_RobertAvram Robert Ionut Avram_Robert Data 16 februarie 2022 16:29:35
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100000;
const int MMAX = 1000000;
const int logmax = 17;

int n, m;

int rmq[1 + NMAX][logmax];
int putere2[1 + NMAX];

void RMQ()
{
    for (int l = 1; (1 << l) <= n; l++)
        for (int i = 1; i <= n - (1 << l) + 1; i++)
            rmq[i][l] = min(rmq[i][l - 1], rmq[i + (1 << l - 1)][l - 1]);
}

int main()
{
    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        in >> rmq[i][0];
    }
    int putere = 1;
    int exponent = 0;
    for (int i = 1; i <= n; i++)
    {
        if (putere * 2 <= i)
        {
            putere *= 2;
            exponent++;
        }
        putere2[i] = exponent;
    }
    RMQ();
    int a, b;
    for (int i = 1; i <= m; i++)
    {
        in >> a >> b;
        out << min(rmq[a][putere2[b - a + 1]],rmq[b-(1 << putere2[b - a + 1]) + 1][putere2[b - a + 1]]) << '\n';
    }
}