Cod sursa(job #2631321)

Utilizator xCata02Catalin Brita xCata02 Data 29 iunie 2020 20:38:56
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define endl "\n"
#define ll long long
#define ull unsigned long long
using namespace std;

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

#define cin  fin
#define cout fout

int n, q;
int rmq[21][100001];
int logaritmi[100001];

void init() {
    logaritmi[1] = 0;
    for(int i=2; i <= n; i++) {
        logaritmi[i] = logaritmi[i / 2] + 1;
    }

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

void calculate(int a, int b) {
    int interval = b - a + 1;
    int lungime  = logaritmi[interval];
    cout << min(rmq[lungime][a], rmq[lungime][a + interval - (1 << lungime)]) << endl;
}

void solve() {
    cin >> n >> q;
    for(int i=1; i <=n; i++) {
        cin >> rmq[0][i];
    }
    init();
    while(q--) {
        int a, b;
        cin >> a >> b;
        calculate(a, b);
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin .tie(0);
    cout.tie(0);

    int testCases = 1;
    //cin >> testCases;
    while(testCases--) {
        solve();
    }
}