Cod sursa(job #2122318)

Utilizator Constantin.Dragancea Constantin Constantin. Data 4 februarie 2018 21:35:45
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>
using namespace std;

int A[100010][20], n, m;       // sparse table, tushar roy the man

int rmq(int st, int dr){
    int l = dr - st + 1, k=0;
    while ((1<<(k+1)) <= l) k++;
    return min(A[st][k], A[st + l - (1<<k)][k]);
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ifstream cin ("rmq.in");
    ofstream cout ("rmq.out");
    cin >> n >> m;
    for (int i=1; i<=n; i++) cin >> A[i][0];
    //preprocessing
    for (int j=1; (1<<j) <= n; j++){
        for (int i=1; i + (1<<j) - 1 <= n; i++){
            A[i][j] = min(A[i][j-1],A[i + (1<<(j-1))][j-1]);
        }
    }
    while (m--){
        int a,b;
        cin >> a >> b;
        cout << rmq(a,b) << "\n";
    }
    return 0;
}