Cod sursa(job #1013036)

Utilizator sziliMandici Szilard szili Data 20 octombrie 2013 10:12:44
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace std;
int A[100001];

//second size should be greater than log2(100000)
int rangeMinimum[100001][18];
int n,m;

void initRMQ() {

    for (int i=0; i<n; i++){
        rangeMinimum[i][0] = i;
    }

    for (int j = 1; (1 << j) <= n; j++){
        for (int i=0; i<n; i++){
            if (i + ((1<<j) - 1) < n){

                if (A[rangeMinimum[i][j-1]] <= A[rangeMinimum[i + (1 << (j-1))][j-1]]){
                    rangeMinimum[i][j] = rangeMinimum[i][j-1];
                } else {
                    rangeMinimum[i][j] = rangeMinimum[i + (1 << (j-1))][j-1];
                }

            }
        }
    }

}

int query(int i, int j) {

    int k = (int) log2(j-i+1);

    if (A[rangeMinimum[i][k]]
    < A[rangeMinimum[j - (1<<k) + 1][k]]) {

        return A[rangeMinimum[i][k]] ;
    } else {
        return A[rangeMinimum[j - (1<<k) + 1][k]];
    }

    return 0;
}

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);


    scanf("%d %d", &n, &m);

    for (int i=0; i<n; i++){
        scanf("%d", &A[i]);
    }

    initRMQ();

    int from, to;
    for (int i=0; i<m; i++){
        scanf("%d %d", &from, &to);
        int minn = query(from-1, to-1);
        printf("%d\n", minn);
    }

    return 0;
}