Cod sursa(job #2817957)

Utilizator DajaMihaiDaja Mihai DajaMihai Data 14 decembrie 2021 21:03:47
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>

#define MAXX 100000

using namespace std;


int v[MAXX + 1], sparseTbl[MAXX + 1][17];

int n, m, i, a, b;

int log2[MAXX + 1];

void precomputeLogs(int n) {
  int i;

  log2[1] = 0;

  for (i = 2; i <= n; ++i)
    log2[i] = log2[i / 2] + 1;
}

void buildTbl(){
    int p;
    for (p = 1; p <= 16; p ++)
        for (i = 0; i + (1 << p) - 1 < n; i ++){
            sparseTbl[i][p] = min(sparseTbl[i][p - 1], sparseTbl[i + (1 << p - 1)][p - 1]);
        }
}

int query (int a, int b){
    int len = b - a + 1;
    return min (sparseTbl[a][log2[len]], sparseTbl[b - (1 << log2[len]) + 1][log2[len]]);
}

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

int main()
{
    in >> n >> m;
    for (i = 0; i < n; i ++)
        in >> sparseTbl[i][0];
    buildTbl();
    precomputeLogs(n);
    for (i = 0; i < m; i ++){
        in >> a >> b;
        out << query(a - 1, b - 1) << '\n';
    }
    return 0;
}