Cod sursa(job #2235712)

Utilizator rnqftwcalina florin daniel rnqftw Data 26 august 2018 20:38:54
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<bits/stdc++.h>

using namespace std;

int v[100040],mat[100700][17];

void preprocess(int n){

    for(int i = 0 ; i< n ; i ++)
        mat[i][0] = i;

    for(int j = 1 ; (1 << j) <= n ; j++)
        for(int i = 0 ; i + (1 << j) - 1 < n ; i++)
            if(v[mat[i][j-1]] < v[mat[(1 << j-1)+i][j-1]])
                mat[i][j] = mat[i][j-1];
            else
                mat[i][j] = mat[(1 << j-1)+i][j-1];
}

int get_min(int left , int right ){
    int l = right - left +1 ;
    int k = (int)log2(l);
    return min(v[mat[left][k]],v[mat[right - (1 << k ) + 1 ][k]]);
}

int main(){
    ifstream in("rmq.in");
    ofstream out("rmq.out");
    int n , m ;
    in >> n >> m ;
    for(int i = 0 ; i < n ; i ++)
        in >> v[i];

    preprocess(n);

    for(int i = 0 ; i < m ; i++){
        int l , r , ans;
        in >> l >> r ;
        l--;
        r--;
        ans = get_min(l,r);
        out << ans << '\n';
    }

}