Cod sursa(job #2511322)

Utilizator Vlad.Vlad Cristian Vlad. Data 18 decembrie 2019 19:50:46
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <cmath>
#define MAXN 100005
#define MAXLOGN 25
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int M[MAXN][MAXLOGN], A[MAXN];
int N, m;
void citire() {
    fin >> N >> m;
    for (int i = 0; i < N; ++i) {
        fin >> A[i];
    }
}
void preProcess() {
    for (int i = 0; i < N; ++i) {
        M[i][0] = i;
    }
    for (int j = 1; (1 << j) <= N; ++j) {
        for (int i = 0; i + (1 << j) - 1 < N; ++i) {
            if (A[M[i][j - 1]] < A[M[i + (1 << j) - 1][j - 1]]) {
                M[i][j] = M[i][j - 1];
            }
            else
                M[i][j] = M[i + (1 << j) - 1][j - 1];
        }
    }
}
int query(int i, int j) {
    int k = log2(j - i + 1);
    return min(A[M[i][k]], A[M[j - (1 << k) + 1][k]]);
}
int main()
{
    citire();
    preProcess();
    int x, y;
    for (int i = 0; i < m; ++i) {
        fin >> x >> y;
        fout << query(x - 1, y - 1) << "\n";
    }
    return 0;
}