Cod sursa(job #3245349)

Utilizator ArklahhisCraciun Mihai Arklahhis Data 28 septembrie 2024 16:58:38
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <iostream>
#include <fstream>
using namespace std;
///
ifstream fin("rmq.in");
ofstream fout("rmq.out");
///
const int LOGMAX=20;
const int NMAX=1e5;
int n, q, v[NMAX+5], log[NMAX+5], rmq[LOGMAX+5][NMAX+5];
///
void formLog() {
    log[1]=0;
    for (int i = 2; i <= n; i++)
        log[i]=log[i/2]+1;
}
///
void formRMQ() {
    for (int i = 1; i <= n; i++)
        rmq[0][i]=v[i];
    int p=1;
    for (int i = 1; i <= log[n]+1; i++) {
        for (int j = 1; j <= n-p; j++)
            rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+p]);
        p*=2;
    }
}
///
int main() {
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
///
    formLog();
    formRMQ();
///
    for (int i = 1; i <= q; i++) {
        int l,r,m;
        fin >> l >> r;
        m=log[r-l+1];
        fout << min(rmq[m][l],rmq[m][r-(1<<m)+1]) << '\n';
    }
    return 0;
}