Cod sursa(job #3310189)

Utilizator robigiirimias robert robigi Data 12 septembrie 2025 05:24:23
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

// this is a sparse table implementation for range minimum queries
// log - precomputes logs for numbers up to n
// table holds range of values based on powers of 2
// table[0][i] = a[i]
// table[1][i] = min(a[i], a[i + 1])
// table[2][i] = min(a[i], a[i + 1], a[i + 2], a[i + 3])
// table[3][i] = min(a[i], a[i + 1], a[i + 2], a[i + 3], a[i + 4], a[i + 5], a[i + 6], a[i + 7])
// and so on...

vector<int> getLogs(int n)
{
    vector<int> log(n + 1);
    log[0] = 0;
    log[1] = 0;
    for (int i = 2; i <= n; ++i)
    {
        log[i] = log[i / 2] + 1;
    }

    return log;
}

vector<vector<int>> makeTable(int n, const vector<int>& a)
{
    vector<int> log = getLogs(n);
    int k = log[n] + 1;
    vector<vector<int>> table(k + 1, vector<int>(n));

    for (int i = 0; i < n; ++i)
        table[0][i] = a[i];
    for (int j = 1; j <= k; ++j)
    {
        for (int i = 0; i <= n - (1 << j); ++i)
        {
            table[j][i] = min(table[j - 1][i], table[j - 1][i + (1 << (j - 1))]);
        }
    }

    return table;
}

int queryTable(int l, int r, const vector<int>& log, const vector<vector<int>>& table)
{
    int len = r - l + 1;
    int k = log[len];
    return min(table[k][l], table[k][r - (1 << k) + 1]);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr); // delete for interactive problems


    ifstream fin("rmq.in");
    ofstream fout("rmq.out");

    int n, m;
    fin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; i++)
        fin >> a[i];

    vector<vector<int>> table = makeTable(n, a);


    for (int i = 0; i < m; i++)
    {
        int l, r;
        fin >> l >> r;
        l--; r--;

        fout << queryTable(l, r, getLogs(n), makeTable(n, a)) << "\n";
    }

    return 0;
}