Cod sursa(job #1541358)

Utilizator lflorin29Florin Laiu lflorin29 Data 3 decembrie 2015 22:39:06
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

class Rmq {
   public:
   vector<int>A, lgTwo;
   vector<vector<int>>work;
   Rmq(int n = 0, const vector<int>&Array = vector<int>()) :
       work(log2(n) + 1, vector<int>(n)),
        A(Array) {};

   void BuildRMQ() {
       const static int &N = A.size();
       for(int i = 0; i < N; ++i)
           work[0][i] = A[i];
       for(int rangeQ = 1; rangeQ < (int)work.size(); ++rangeQ)
            for(int i = 0; i < N; ++i)
                work[rangeQ][i] = min(work[rangeQ - 1][i], work[rangeQ - 1][i + (1 << (rangeQ - 1))]);
       lgTwo = vector<int>(*max_element(A.begin(), A.end()) + 1, 0);
       for(int i = 2; i < (int)lgTwo.size(); ++i)
           lgTwo[i] = lgTwo[i >> 1] + 1;
   }

   int query(int from, int to) {
       int traversal = to - from + 1, usingLog = lgTwo[traversal];
       return min(work[usingLog][from], work[usingLog][to - (1 << usingLog) + 1]);
   }
};

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

    int N, tests;
    cin >> N >> tests;
    vector<int>A(N, 0);
    for(int i = 0; i < N; ++i)
        cin >> A[i];
    Rmq object(N, A);
    object.BuildRMQ();

    while(tests--) {
         int node, edge;
         cin >> node >> edge;
         cout << object.query(node - 1, edge - 1) << '\n';
    }

    return 0;
}