Cod sursa(job #2789474)

Utilizator guzgandemunteIonescu Laura guzgandemunte Data 27 octombrie 2021 16:14:59
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100000
#define LOGMAX 20

using namespace std;

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

int N, M, x, y;
int arr[NMAX], lg2[NMAX + 1];
int rmq[LOGMAX][NMAX];

void preprocesare()
{
    for (int i = 2; i <= N; i++)
        lg2[i] = lg2[i/2] + 1;

    for (int i = 0; i < N; i++)
        rmq[0][i] = i;

    for (int k = 1; (1 << k) <= N; k++)
        for (int i = 0; i + (1 << k) - 1 < N; i++)
        rmq[k][i] = arr[rmq[k - 1][i]] < arr[rmq[k - 1][i + (1 << (k - 1))]] ? rmq[k - 1][i] : rmq[k - 1][i + (1 << (k - 1))];
}

int answerQuery(int a, int b)
{
    int k = lg2[b - a + 1];
    return arr[rmq[k][a]] < arr[rmq[k][b - (1 << k) + 1]] ? rmq[k][a] : rmq[k][b - (1 << k) + 1];
}

int main()
{
    fin >> N >> M;

    for (int i = 0; i < N; ++i) fin >> arr[i];

    preprocesare();

    while (M--)
    {
        fin >> x >> y;
        fout << arr[answerQuery(x - 1, y - 1)] << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}