Cod sursa(job #2501810)

Utilizator ililogIlinca ililog Data 30 noiembrie 2019 11:30:57
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 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 lim) {

    int exp = 0;
    int p = 1;
    while (p*2 <= lim) {
        exp++;
        p *= 2;
    }

    return exp;
}

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

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

    while (linie < n) {
        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(b-a+1);

       // cout << k << endl;

        fout <<rmq[b-a+1][a] << endl;
    }



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

    return 0;
}