Cod sursa(job #3199238)

Utilizator MagicantPlusIuoras Andrei MagicantPlus Data 1 februarie 2024 09:05:39
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

#define cin fin
#define cout fout

int bits(int x);
int rangeMinimum(vector<vector<int>>& sparseTable, int left, int right);

int main()
{
    int n, m;
    vector<vector<int>> sparseTable;

    cin >> n >> m;
    sparseTable.resize(bits(n));
    sparseTable[0].resize(n);
    
    for(int i = 0; i < n; i++)
    {
        cin >> sparseTable[0][i];
    }

    for(int exp = 1, pow2 = 2; exp < sparseTable.size(); exp++, pow2 *= 2)
    {   
        sparseTable[exp].resize(n - pow2 + 1);

        for(int i = 0; i < sparseTable[exp].size(); i++)
        {
            sparseTable[exp][i] = min(sparseTable[exp - 1][i], sparseTable[exp - 1][i + pow2 / 2]);
        }
    }

    for(int i = 0, left, right; i < m; i++)
    {
        cin >> left >> right;

        left--;
        right--;

        cout << rangeMinimum(sparseTable, left, right) << '\n';
    }

    return 0;
}

int bits(int x)
{
    int bits_ = 0;

    while(x > 0)
    {
        x >>= 1;
        bits_++;
    }

    return bits_;
}

int rangeMinimum(vector<vector<int>>& sparseTable, int left, int right)
{
    int exp = 0, pow2 = 1, sizeCopy = right - left + 1;

    while(sizeCopy > 0)
    {
        sizeCopy >>= 1;
        exp++;
        pow2 *= 2;
    }

    exp--;
    pow2 /= 2;

    return min(sparseTable[exp][left], sparseTable[exp][right - pow2 + 1]);
}