Cod sursa(job #2612149)

Utilizator buhaidarius@gmail.comBuhai Darius [email protected] Data 8 mai 2020 15:43:52
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>

#define MAXV 100001

using namespace std;

vector<int> vals;
int *stree;

int construct(int l, int r, int i){
    if(l==r){
        stree[i] = vals[l];
        return vals[l];
    }
    int mid = l+(r-l)/2;
    stree[i] = min(construct(l, mid, i*2+1),construct(mid+1, r, i*2+2));
    return stree[i];
}

int rmq(int l, int r, int qs, int qe, int i){
    if (qs <= l && qe >= r)
        return stree[i];

    if (r < qs || l > qe)
        return MAXV;

    int mid = l+(r-l)/2;
    return min(rmq(l, mid, qs, qe, 2*i+1), rmq(mid+1, r, qs, qe, 2*i+2));
}

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    int n, m, x;
    /// Read data
    fin>>n>>m;
    for(int i=0;i<n;++i){
        fin>>x;
        vals.push_back(x);
    }
    /// Resize and construct tree
    x = 2*static_cast<int>(pow(2, ceil(log2(n))) - 1);
    stree = new int(x);
    construct(0, n-1, 0);
    /// Walk tree for every range
    int qs, qe;
    while(m--){
        fin>>qs>>qe;
        fout<<rmq(0, n-1,qs-1, qe-1, 0)<<'\n';
    }
    return 0;
}