Cod sursa(job #3134186)

Utilizator LazarDanielGabrielLazar Daniel-Gabriel LazarDanielGabriel Data 28 mai 2023 18:10:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <limits>
using namespace std;

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

vector<int> segmentTree;

void buildSegmentTree(const vector<int>& arr, int node, int start, int end) {
    if (start == end) {
        segmentTree[node] = arr[start];
    } else {
        int mid = (start + end) / 2;
        buildSegmentTree(arr, 2 * node, start, mid);
        buildSegmentTree(arr, 2 * node + 1, mid + 1, end);
        segmentTree[node] = min(segmentTree[2 * node], segmentTree[2 * node + 1]);
    }
}

int querySegmentTree(int node, int start, int end, int left, int right) {
    if (right < start || left > end) {
        return numeric_limits<int>::max();
    }
    if (left <= start && right >= end) {
        return segmentTree[node];
    }
    int mid = (start + end) / 2;
    int leftMin = querySegmentTree(2 * node, start, mid, left, right);
    int rightMin = querySegmentTree(2 * node + 1, mid + 1, end, left, right);
    return min(leftMin, rightMin);
}

int main() {
    int n, m;
    fin >> n >> m;

    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        fin >> arr[i];
    }


    segmentTree.resize(4 * n);
    buildSegmentTree(arr, 1, 0, n - 1);

    for (int i = 0; i < m; i++) {
        int x, y;
        fin >> x >> y;
        int minValue = querySegmentTree(1, 0, n - 1, x - 1, y - 1);
        fout << minValue << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}