Cod sursa(job #2231681)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 15 august 2018 16:29:19
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<fstream>
using namespace std;
ifstream fin("rmq.in"); ofstream fout("rmq.out");
int n, m, rmq[100001][18], a[100001], Log[100001];
 
void preprocess_RMQ() {
    int i, j, lng, half;
    //process intervals of length 1
    for (i = 0; i < n; i++) rmq[i][0] = a[i];
    //process bigger intervals
    for (j = 1, lng = 2; lng < n; lng = 1 << ++j)
        for (i = 0, half = lng / 2; i + lng <= n; i++)
            rmq[i][j] = min(rmq[i + half][j - 1], rmq[i][j - 1]);
}
 
int minim(int x, int y) {
    int l_min = rmq[x][Log[y - x]];
    int r_min = rmq[y - (1 << Log[y - x]) + 1][Log[y - x]];
    return min(l_min, r_min);
}
 
int main() {
    int i, x, y;
    fin >> n >> m;
    for (i = 0; i < n; i++) fin >> a[i];
    for (Log[1] = 0, i = 2; i <= n; i++) Log[i] = Log[i / 2] + 1;
         
    preprocess_RMQ();
     
    for (i = 0; i < m; i++)
        fin >> x >> y, fout << minim(x - 1, y - 1) << "\n";
}