Cod sursa(job #2815008)

Utilizator cegaxEmanuel Soto Ortega cegax Data 8 decembrie 2021 22:58:36
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;
#define all(c) (c).begin(), (c).end()
#define rall(A) A.rbegin(),A.rend()
#define pb push_back 
#define dbg(x) do {cerr << #x <<" = " << (x) << endl; } while (false)
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
//cout << setprecision(12) << fixed;

const int maxn = 1e5+5;

int n, q;
int a[maxn], t[4*maxn];

void build(int v, int tl, int tr) {
    if(tl == tr) {
        t[v] = a[tl];
    }
    else {
        int tm = (tl+tr)>>1;
        build(v*2, tl, tm);
        build(v*2+1, tm+1, tr);
        t[v] = min(t[v*2], t[v*2+1]);
    }
}

int query(int v, int tl, int tr, int l, int r) {
    if(tr < l or tl > r) 
        return 1e9;
    if(tl == l and tr == r) {
        return t[v];
    }
    else {
        int tm = (tl+tr)>>1;
        return min(query(v*2, tl, tm, l, min(r, tm)), query(v*2+1, tm+1, tr, max(l, tm+1), r));
    }
}

int main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    ifstream in; ofstream out;

    in.open("rmq.in");
    out.open("rmq.out");

    in >> n >> q;
    for(int i = 0; i < n; i++) 
        in >> a[i];
    
    build(1, 0, n-1);
    while(q--) {
        int l, r; in >> l >> r;
        l--; r--;

        out << query(1, 0, n-1, l, r) << "\n";
    }

    return 0;
}