Cod sursa(job #3125928)

Utilizator chipsSabou Ioan Alexandru chips Data 4 mai 2023 19:51:06
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

#define MAX_INT (int)2147483645;

void setIO(){
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
}

int pow2big(int n){
    int i = 1;
    while(i < n){
        i*=2;
    }
    return i;
}

void build_seg_tree(int node, int l, int r, vector<int>& st, vector<int> &v){
    if(l == r){
        st[node] = v[l];
        return;
    }
    //left
    build_seg_tree(node * 2 + 1, l, (l+r)/2, st, v);
    //right
    build_seg_tree(node * 2 + 2, (l+r)/2 + 1, r, st, v);
    st[node] = min(st[node*2+1], st[node*2+2]);
}

int rmq(int node, int ql, int qr, int l, int r, vector<int> &st){
    //sunt cu prins cu totul
    if(ql <= l && r <= qr){
        return st[node];
    }else if(qr < l || r < ql){
        return MAX_INT;
    }
    return min(rmq(node*2+1, ql, qr, l, (l+r)/2, st), rmq(node*2+2, ql, qr, (l+r)/2+1, r , st));
}

int main(){
    setIO();
    int n,m,x,y;
    cin >> n >> m;
    vector<int> v(n);
    for(int i = 0; i < n; i++){
        cin >> v[i];
    }
    vector<int> st(2 * pow2big(n) - 1);
    build_seg_tree(0,0,n-1, st,v);
    for(int i = 0; i < m; i++){
        cin >> x >> y;--x;--y;
        cout << rmq(0,x,y,0,n-1,st) << endl;
    }
}