Cod sursa(job #3354472)

Utilizator lucasmaneaLucas Manea lucasmanea Data 18 mai 2026 14:37:38
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <stack>
#include <string>
#include <random>
#include <unordered_set>
#include <set>

using namespace std;

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

void buildSparseTable(vector<vector<int>>& table, vector<int>& arr, int& n, int& maxpow) {
    for (int i = 0; i < n; i++) {
        table[0][i] = arr[i]; 
    }

    for (int i = 1; i <= maxpow; i++) {
        int length = 1 << i;
        int offset = 1 << (i - 1);

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

int query(int l, int r, vector<vector<int>>& table) {
    int len = r - l + 1;
    int k = floor(log2(len));

    return min(table[k][l], table[k][r - (1 << k) + 1]);
}

int main() {
   int n, m;

   fin >> n >> m;

   vector<int> arr;

   int x;

   for (int i = 0; i < n; i++) {
        fin >> x;
        arr.push_back(x);
   }

   int maxpow = floor(log2(n));

   vector<vector<int>> table(maxpow + 1, vector<int>(n, 0));

   buildSparseTable(table, arr, n, maxpow);

   int l, r;

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

        fout << query(l - 1,r - 1,table) << endl;
   }

}