Cod sursa(job #2013767)

Utilizator LucaSeriSeritan Luca LucaSeri Data 22 august 2017 13:00:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>

using namespace std;

int dp[100010][25];
int v[100010];
int log[100010];


ifstream cin("rmq.in");
ofstream cout("rmq.out");

int Range_Query(int n, int x, int y){
    int l = log[y-x];
    return min(dp[x][l], dp[y-(1<<l)][l]);
}

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

    for(int i = 1; i < n; ++i){
        dp[i][0] = min(v[i], v[i+1]);
    }

    for(int i = 2; i <= n; ++i){
        log[i] = log[i/2] + 1;
    }

    for(int j = 1; j <= log[n]; ++j){
        for(int i = 1; i <= n; ++i){
            if(i + (1<<j) > n) break;
            dp[i][j] = min(dp[i][j-1], dp[i + (1 << (j-1))][j-1]);
        }
    }

    for(int i = 0, x, y; i < m; ++i){
        cin >> x >> y;
        if(x == y){
            cout << v[x] << '\n';
            continue;
        }

        cout << Range_Query(n, x, y) << '\n';
    }
    return 0;
}