Cod sursa(job #3233244)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 2 iunie 2024 20:41:02
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <climits>

using namespace std;

class SegmentTree {
    vector<int> tree;
    int size;

public:
    SegmentTree(const vector<int>& data) {
        size = data.size();
        tree.resize(4 * size);
        buildTree(data, 0, size - 1, 0);
    }

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

    int query(int qs, int qe, int ss, int se, int node) {
        if (qs <= ss && qe >= se) {
            return tree[node];
        }
        if (qs > se || qe < ss) {
            return INT_MAX;
        }
        int mid = ss + (se - ss) / 2;
        return min(query(qs, qe, ss, mid, 2 * node + 1), query(qs, qe, mid + 1, se, 2 * node + 2));
    }

    int query(int left, int right) {
        return query(left, right, 0, size - 1, 0);
    }
};

int main() {
    ifstream infile("rmq.in");
    ofstream outfile("rmq.out");

    int N, M;
    infile >> N >> M;

    vector<int> A(N);
    for (int i = 0; i < N; ++i) {
        infile >> A[i];
    }

    SegmentTree segmentTree(A);

    for (int i = 0; i < M; ++i) {
        int x, y;
        infile >> x >> y;
        outfile << segmentTree.query(x - 1, y - 1) << "\n";
    }

    infile.close();
    outfile.close();

    return 0;
}