Cod sursa(job #3309054)

Utilizator alesiodemiriAlesio Demiri alesiodemiri Data 31 august 2025 15:38:50
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <queue>
#include <algorithm>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <string>
#include <deque>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
#include <iomanip>

using namespace std;

#define ll long long

const int INF = 1e6;
struct SegmentTree{
    int n;
    int size;
    vector<int> seg;

    SegmentTree(vector<int>& arr){
        n = arr.size();
        size = 1;

        while (size <= n) size<<=1;

        seg.resize(2 * size, INF);

        // populate the leaves
        for (int i = 0; i < n; i++) seg[size + i] = arr[i];

        for(int i = size - 1; i > 0; --i){
            seg[i] = min(seg[2*i], seg[2*i + 1]);
        }
    }

    int query(int node, int left, int right, int a, int b){
        if (right < a || b < left)  return INF;
        if (a <= left && b >= right) return seg[node];

        int mid = left + (right - left)/2;
        return min(query(2*node, left, mid, a, b), 
        query(2*node + 1, mid +1, right, a , b));
        
    }

};

int n, m;
vector<int> values;

void ReadData() {
    cin >> n >> m;
    int value = 0;
    for(int i = 0; i < n ; ++i){
        cin >> value;
        values.push_back(value);
    }
}

void Solve() {
    SegmentTree seg(values);
    int a, b;
    for (int i = 0; i < m; i++)
    {
        cin >> a >> b;
        a--; b--;
        cout << seg.query(1, 0, seg.size - 1, a , b) << "\n";
    }
    
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    freopen("rqm.in", "r", stdin);
    freopen("rqm.out", "w", stdout);

    int t = 1;
    // cin >> t; // Uncomment for multiple test cases
    while (t--) {
        ReadData();
        Solve();   
    }
    return 0;
}