Cod sursa(job #1926929)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 14 martie 2017 20:03:30
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>

inline int abs(int x){return (x >= 0) ? x : -x;}
inline int min(int a, int b){return (a < b) ? a : b;}

int numbers, queries, left, right;
int sequence[100001], sparseMatrix[18][100001];
int logarithm[100001];

int main(){

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

    scanf("%d %d", &numbers, &queries);

    for(int i = 1; i <= numbers; i++){
        scanf("%d", &sequence[i]);
    }
    //Preprocessing
    for(int i = 1; i <= numbers; i++){
        sparseMatrix[0][i] = sequence[i];
    }
    for(int j = 1; (1 << j) < numbers; j++){
        for(int i = 1; i <= numbers; i++){
            sparseMatrix[j][i] = min(sparseMatrix[j - 1][i], sparseMatrix[j - 1][i + (1 << (j - 1))]);
        }
    }
    //Queries
    for(int i = 2; i <= numbers; i++){
        logarithm[i] = logarithm[i >> 1] + 1;
    }
    for(int i = 1; i <= queries; i++){
        scanf("%d %d", &left, &right); right++;
        int k = logarithm[abs(left - right)];
        printf("%d\n", min(sparseMatrix[k][left], sparseMatrix[k][right - (1 << k)]));
    }
    return 0;
}