Cod sursa(job #3205055)

Utilizator stefangab95Muscalu Stefan Gabriel stefangab95 Data 18 februarie 2024 18:09:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 100005, MMAX = 1000005;
int n, m, p[NMAX], tm[4 * NMAX];
vector<int> tr[NMAX];

void build(int node, int st, int en) {
    if (st == en) {
        tm[node] = p[st];
        return;
    }
    int mid = (st + en) / 2, left = node * 2, right = left + 1;
    build(left, st, mid);
    build(right, mid + 1, en);
    tm[node] = min(tm[left], tm[right]);
}

void update(int node, int st, int en, int pos) {
    if (st == en) {
        tm[node] = tr[pos][0];
        return;
    }
    int mid = (st + en) / 2, left = node * 2, right = left + 1;
    if (pos <= mid) update(left, st, mid, pos);
    else update(right, mid + 1, en, pos);
    tm[node] = min(tm[left], tm[right]);
}

int query(int node, int st, int en, int i, int j) {
    if (i > en || j < st) return 1e9;
    if (st >= i && en <= j) return tm[node];
    int mid = (st + en) / 2, left = node * 2, right = left + 1;
    return min(query(left, st, mid, i, j), query(right, mid + 1, en, i, j));
}

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) fin >> p[i], tr[i].push_back(p[i]);
    build(1, 1, n);
    for (int i = 1; i <= m; ++i) {
        int x, y; fin >> x >> y;
        fout << query(1, 1, n, x, y) << "\n";
    }
    return 0;
}