Cod sursa(job #3330549)

Utilizator ONLYGODYBochis Andrei ONLYGODY Data 20 decembrie 2025 09:53:54
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
// #define fi cin
// #define fo cout

string FILENAME = "rmq";
ifstream fi (FILENAME + ".in");
ofstream fo (FILENAME + ".out");

vector<vector<ll>> rmq;
vector<ll> lg2;
vector<int> values;
ll n;
ll m;

int query(ll, ll);

int main() {

    fi >> n >> m;
    lg2.resize(n + 1);

    for(ll i = 2, x; i <= n; ++i)
            lg2[i] = lg2[i / 2] + 1;

    rmq.assign(lg2[n] + 1, vector<ll>(n + 1));

    for(ll i = 1, x; i < n; ++i) {

        fi >> x;
        rmq[0][i] = x;
    }

    for(ll k = 1; (1 << k) <= n; ++k)
        for(ll i = 1, j; i + (1 << k) - 1 <= n; ++i) {

            j = i + (1 << (k - 1));
            rmq[k][i] = min(rmq[k - 1][i], rmq[k - 1][j]);
        }

    for(ll i = 0, x, y; i < m; ++i) {

        fi >> x >> y;
        cout << query(x, y) << '\n';
    }

    return 0;
}

int query(const ll x, const ll y) {

    const ll len = y - x + 1;
    const ll k = log2(len);
    const ll a = min(rmq[k][y], rmq[k][y - (1 << k) + 1]);
    if(a > 1)
        return (a - 1);

    return a;
}