Cod sursa(job #1306838)

Utilizator gabrieligabrieli gabrieli Data 31 decembrie 2014 16:18:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <cmath>
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;

inline
int query(const int a, const int b, const vector<vector<int>>& rmq) {
    int p = floor(log2(b - a + 1));
    return min( rmq[a][p],
                rmq[b - (1 << p) + 1][p]);
}

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    
    int n, m;
    fin >> n >> m;
    
    // build DP RMQ table
    vector<vector<int>> table(n+1, {0});
    
    for (int i = 1; i <= n; ++i)
        fin >> table[i][0];
        
    for (int i = n; 0 < i; --i)
        for (int j = 1; i + (1 << j) - 1 <= n; ++j)
            table[i].push_back(min(table[i][j-1], table[i + (1 << (j - 1))][j-1]));
    
    int a, b;
    while (m--) {
        fin >> a >> b;
        fout << query(a, b, table) << '\n';
    }
    
    return 0;
}