Cod sursa(job #2614734)

Utilizator RNedelcuNedelcu Radu RNedelcu Data 12 mai 2020 16:37:19
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
#define MAX 100002
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int LOG[18]; // log2(MAX)+1
int RMQ[MAX][18];
int N,M,L,R;
int main()
{
    LOG[1] =0;
    for(int i=2; i<=MAX; i++)
        LOG[i]=LOG[i/2] +1;
    in>>N>>M;
    for (int i = 0; i < N; i++) // Pe bucatile de lungime 1, cel mai mic element e chiar el
        in>> RMQ[i][0];

    for (int j = 1; (1<<j) <= N; j++) // Pt fiecare putere a lui 2
        for (int i = 0; i + (1 << j) <= N; i++) // Pt fiecare "offset" din interval
            RMQ[i][j] = min(RMQ[i][j-1], RMQ[i + (1 << (j - 1))][j - 1]); // Minimul e minimul celor 2 intervale calculate anterior
    while(M--)
    {
        in>>L>>R;
        L--; //Avem array-ul indexat de la 0, intrebarile sunt de la 1
        R--;
        int j = LOG[R - L + 1];
        int minimum = min(RMQ[L][j], RMQ[R - (1 << j)+1 ][j]); // Impart intervalul dupa cea mai apropiata putere a lui 2 si apoi compar minimele
        out<<minimum<<'\n';
    }

    return 0;
}