Cod sursa(job #3183045)

Utilizator not_anduAndu Scheusan not_andu Data 10 decembrie 2023 15:37:07
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
/**
 * Author: Andu Scheusan (not_andu)
 * Created: 10.12.2023 15:22:53
 */

#include <bits/stdc++.h>
#pragma GCC optimize("O3")

using namespace std;

#define INFILE "rmq.in"
#define OUTFILE "rmq.out"

typedef long long ll;

const int NMAX = 100'000, LOGMAX = 16;
int lg[NMAX + 1]; // floor(log2(n)) (parte intreaga inferioara)

struct Rmq
{

    vector<int> rmq[LOGMAX + 1];
    int n;

    Rmq(int _n, vector<int> &v)
    {
        n = _n;
        for (int i = 1; i <= n; ++i)
        {
            rmq[0][i] = v[i];
        }

        for (int bit = 1; bit <= lg[n]; ++bit)
        {
            for (int i = 1; i + (1 << (bit - 1)) <= n; ++i)
            {
                rmq[bit][i] = min(rmq[bit - 1][i], rmq[bit - 1][i + (1 << (bit - 1))]);
            }
        }
    }

    int query(int l, int r)
    {

        int layer = lg[r - l + 1];

        int min1 = rmq[layer][l];
        int min2 = rmq[layer][r - (1 << layer) + 1];

        return min(min1, min2);
    }
};

int main()
{
    int n, q;
    cin >> n >> q;
    lg[1] = 0; // log2(n) = log2(n/2 * 2) = log2(n/2) + log2(2) = log2(n/2) + 1
    for (int i = 2; i <= n; ++i)
    {
        lg[i] = lg[i / 2] + 1;
    }
    vector<int> v(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
    }
    Rmq rmq(n, v);
    while (q--)
    {
        int l, r;
        cin >> l >> r;
        cout << rmq.query(l, r) << '\n';
    }
    return 0;
}