Cod sursa(job #3130472)

Utilizator TirilaPatricTirila Patric-Gabriel TirilaPatric Data 17 mai 2023 20:41:08
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;

int rmq[100003][17], logg2[100003];

int main(){
    ifstream f("rmq.in");
    ofstream g("rmq.out");


    int n, m;
    f>>n>>m;
    int a[n], i = 0;

    while(i<n){
        f>>a[i++];
    }

    for (int i = 0; i < n; i++) {
        rmq[i][0] = a[i];
    }

    for (int j = 1; pow(2, j) <= n; j++) {
        int p = pow(2, j-1);
        for (int i = 0; i + p*2 - 1 < n; i++) {
            if (rmq[i][j - 1] < rmq[i + p][j - 1]) {
                rmq[i][j] = rmq[i][j - 1];
            } else {
                rmq[i][j] = rmq[i + p][j - 1];
            }
        }
    }

    logg2[1] = 0;
    for(int i = 2; i <= n; i ++)
        logg2[i] = logg2[i / 2] + 1;

    cout<<endl;
    int b, c;
    while(m>0){
        f>>b>>c;
        b--; c--;
        int k = logg2[c-b+1], p = pow(2, k);
        if (rmq[b][k] <= rmq[c-p+1][k]) {
            g<<rmq[b][k]<<endl;
        } else {
            g<<rmq[c - p + 1][k]<<endl;
        }
        m--;
    }


    f.close();
    g.close();

    return 0;
}