Cod sursa(job #2792537)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 1 noiembrie 2021 21:02:49
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
/* [A][M][C][B][N] / [K][R][I][P][6][8] */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const char sp = ' ', nl = '\n';
const int MOD = 9001;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

template<typename Cmp>
class RMQ {
private:
    vector<vector<int>> lookup;
    vector<int> vec;
    Cmp cmp;
public:
    RMQ(vector<int>& v) : vec(v) {
        int size = vec.size(), lg = log2(vec.size());
        lookup = vector<vector<int>>(size, vector<int>(lg + 1));
        for (int i = 0; i < size; ++i)
            lookup[i][0] = i;
        for (int p = 1; p <= lg; ++p) {
            for (int i = 0; i + (1 << p) <= size; ++i) {
                int curr = lookup[i][p - 1];
                int next = lookup[i + (1 << (p - 1))][p - 1];
                lookup[i][p] = cmp(vec[curr], vec[next]) ? curr : next;
            }
        }
    }
    int querry(int st, int dr) {
        int p = int(log2(dr - st + 1));
        int curr = lookup[st][p];
        int next = lookup[dr - (1 << p) + 1][p];
        return cmp(vec[curr], vec[next]) ? curr : next;
   
    }
};

class Cmp {
public:
    bool operator()(const int& a, const int& b) {
        return a <= b;
    }
};

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n, q;
    fin >> n >> q;
    vector<int> v(n);
    for (int& e : v) fin >> e;
    RMQ<Cmp> rmq(v);
    while (q--) {
        int st, dr;
        fin >> st >> dr;
        fout << v[rmq.querry(st - 1, dr - 1)] << nl;
    }
}