Cod sursa(job #1982158)

Utilizator patrixKovacs Patrik patrix Data 17 mai 2017 19:30:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

void rmq(vector<int> &x, vector<vector<int> > &m) {
    m.resize(x.size(), vector<int>(int(log2(x.size()))+1));
    for(int i=0; i<x.size(); ++i)
        m[i][0] = i;

    for(int j=1; 1 << j <= x.size(); ++j) {
        for(int i=0; i + (1 << j) - 1 < x.size(); ++i) {
            if(x[m[i][j-1]] < x[m[i + (1 << (j-1))][j-1]])
                m[i][j] = m[i][j-1];
            else
                m[i][j] = m[i + (1 << (j-1))][j-1];
        }
    }
}

int main() {
    int n, l;
    f >> n >> l;
    vector<int> x(n);
    for(auto &it: x) {
        f >> it;
    }

    vector<vector<int> > m;
    rmq(x, m);

    int q, w;
    for(int i=0; i<l; ++i) {
        f >> q >> w;
        --q;
        --w;
        int k = log2(w-q+1);
        int first, second;
        if((first = x[m[q][k]]) <= (second = x[m[w-(1 << k)+1][k]]))
            g << first << '\n';
        else
            g << second << '\n';
    }

}