Cod sursa(job #2500895)

Utilizator ililogIlinca ililog Data 28 noiembrie 2019 20:11:41
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
using namespace std;
#include<iostream>
#include<fstream>

#define LMAX 100002

int n,m;
int a, b;
int k = 1;

int v[LMAX];
int rmq[18][LMAX];

int calcularePutere(int k, int lim, int p) {
    while (k*p <= lim) {
        k *= p;
    }

    return k;
}

void calculareRMQ(int v[], int rmq[][LMAX]) {
    int p = 1;
    int linie = 1;

    for (int i = 1; i<=n; i++) {
        rmq[1][i] = v[i];
    }

    while (linie < n) {
        p *= 2;
        linie++;

        for (int i = 1; i<=n-linie+1; i++) {
            rmq[linie][i] = min(rmq[linie-1][i], rmq[linie-1][i+1]);
        }
    }

    /*for (int i = 1; i<=linie; i++) {
        for (int j = 1; j<=n-i+1; j++) {
            cout << rmq[i][j] << " ";
        }
        cout << endl;
    }*/
}

int main() {

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

    fin >> n >> m;

    for (int i = 1; i<=n; i++) {
        fin >> v[i];
    }

    calculareRMQ(v, rmq);
    //cout << endl;


    for (int i = 1; i<=m; i++) {
        k = 1;
        fin >> a >> b;

        k = calcularePutere(k, b-a+1, 2);

       // cout << k << endl;

        fout << min(rmq[k][a], rmq[k][b-k+1]) << endl;
    }



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

    return 0;
}