Cod sursa(job #1815618)

Utilizator vazanIonescu Victor Razvan vazan Data 25 noiembrie 2016 14:58:12
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#include<algorithm>
#define NMAX 100100
using namespace std;

int aint[2*NMAX];
int elem[NMAX];
int constr(int poz, int left, int right){
    if(left == right){
        aint[poz] = elem[left];
        return elem[left];
    }
    int mid = (left + right) / 2;
    aint[poz] = min(constr(2 * poz, left, mid), constr(2 * poz + 1, mid + 1, right));
    return aint[poz];
}

int querry(int poz, int left, int right, int lc, int rc){
    if(lc == left && rc == right){
        return aint[poz];
    }
    int mid = (left + right) / 2;
    if(rc <= mid)
        return querry(2 * poz, left, mid, lc, rc);
    else if(lc >= mid + 1)
        return querry(2 * poz + 1, mid + 1, right, lc, rc);
    else return min( querry(2 * poz, left, mid, lc, mid), querry(2 * poz + 1, mid + 1, right, mid + 1, rc));
}


int main(){
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int n, i, m;
    scanf("%d%d", &n, &m);
    for(i = 1; i <= n; i++)
        scanf("%d", &elem[i]);
    constr(1, 1, n);
   /* for(i = 1; i <= 2 * n; i++)
        printf("%d ", aint[i]);*/
    int c, d;
    for(i = 1; i <= m; i++){
        scanf("%d%d", &c, &d);
        printf("%d\n", querry(1, 1, n, c, d));
    }
    return 0;
}