Cod sursa(job #2242038)

Utilizator AnDrEeA1915Monea Andreea AnDrEeA1915 Data 17 septembrie 2018 17:19:53
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<iostream>
#include<fstream>
using namespace std;

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

#define nmax 100000
#define lmax 17

int rmq[lmax + 2][nmax + 2];
char lg[nmax + 2];

int main()  {
    int n, m, v;
    fin >> n >> m;
    for(int i = 1; i <= n; ++i){
        fin >> v;
        rmq[0][i] = v;
    }
    for(int i = 2;i <= n; ++i)
        lg[i] = lg[i >> 1] + 1;

    for(int j = 1;(1 << j) <= n; ++j)
        for(int i = 1; i + (1 << j) <= n + 1; ++i)
            rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);

    for(int i = 0; i < m; ++i)  {
        int a, b;
        fin >> a >> b;
        int k = b - a + 1;
        k = lg[k];
        fout << min(rmq[k][a], rmq[k][b - (1 << k) + 1]);
        fout << endl;
    }
    return 0;
}