Cod sursa(job #2614362)

Utilizator buhaidarius@gmail.comBuhai Darius [email protected] Data 11 mai 2020 17:33:31
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <vector>

#define MAXN 100001

using namespace std;

int int_tree[MAXN*4];
int minim;

void mini(int l, int r, int qs, int qe, int i){
    if (qs <= l && qe >= r){
        minim = min(minim, int_tree[i]);
        return;
    }
    int mid = (l+r)/2;
    if(qs<=mid) mini(l, mid, qs, qe, 2*i+1);
    if(qe>mid) mini(mid+1, r, qs, qe, 2*i+2);
}

void change_element(int l, int r, int i, int k, int val){
    if(l==r){
        int_tree[i] = val;
        return;
    }
    int mid = (l+r)/2;

    if(k<=mid) change_element(l, mid, i*2+1, k, val);
    else change_element(mid+1, r, i*2+2, k, val);
    int_tree[i] = min(int_tree[2*i+1], int_tree[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;
        change_element(0,n-1,0,i, x);
    }
    /// Walk tree for every range
    int a, b;
    while(m--){
        fin>>a>>b;
        minim = 9999999;
        mini(0, n-1,a-1, b-1, 0);
        fout<<minim<<'\n';
    }
    return 0;
}