Cod sursa(job #2484885)

Utilizator aZvezdaAtanas Dimitrov aZvezda Data 31 octombrie 2019 18:46:41
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")
#define endl "\n"
#define pb push_back
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const ll mod = 1e9 + 7;

const ll MAX_N = 1e5 + 10, MAX_LOG = 18;
ll a[MAX_N], p[MAX_N][MAX_LOG];

ll query(int l, int r) {
    int st = -1;
    ll ps = 1;
    while(ps <= (r - l + 1)) {
        st ++;
        ps *= 2ll;
    }
    return min(p[l][st], p[r - (1ll << st) + 1][st]);
}

int main() {
    //ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    ofstream myfile;
    myfile.open ("rmq.out");
    ifstream myFileIn;
    myFileIn.open ("rmq.in");
    int n, q;
    myFileIn >> n >> q;
    for(int i = 0; i < n; i ++) {
        myFileIn >> a[i];
    }
    ///Precomputing
    for(int k = 0; k < n; k ++) {
        p[k][0] = a[k];
    }
    for(int j = 1; (1ll << j) < n; j ++) {
        for(int k = 0; k + (1ll << j) <= n; k ++) {
            p[k][j] = min(p[k][j - 1], p[k + (1ll << (j - 1))][j - 1]);
        }
    }
    while(q --) {
        int l, r;
        myFileIn >> l >> r;
        myfile << query(l - 1, r - 1) << endl;
    }
    return 0;
}