Cod sursa(job #3169698)

Utilizator Allie28Radu Alesia Allie28 Data 15 noiembrie 2023 19:44:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>

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

const int LMAX = 100005;
int v[LMAX], rmq[LMAX][20];

int main() {
    int n, m;
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> v[i];
    }
    for (int i = 1; i < n; i++) {
        rmq[i][0] = min(v[i], v[i+1]);
    }
    rmq[n][0] = v[n];
    for (int j = 1; j <= 19; j++) {
        for (int i = 1; i <= n; i++) {
            if (i + (1<<(j-1)) > n) {
                rmq[i][j] =  rmq[i][j-1];
            }
            else {
                rmq[i][j] = min(rmq[i][j-1], rmq[i+(1<<(j-1))][j-1]);
            }
        }
    }
    //la rmq[i][j] am elem min din intervalul [x, x + 2^j lea element]
    while (m--) {
        int x, y, mini;
        fin >> x >> y;
        mini = v[x];
        int j = 19, shift = (1<<j);
        while (x < y) {
            while (j >= 0 && x + shift > y) {
                j--;
                shift = (shift>>1);
            }
            mini = min(mini, rmq[x][j]);
            x = x + shift + 1;
        }
        mini = min(mini, v[y]);
        fout<<mini<<endl;
    }



    fin.close();
    fout.close();

    return 0;
}