Cod sursa(job #894092)

Utilizator sebii_cSebastian Claici sebii_c Data 26 februarie 2013 19:40:05
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
// O(1) query using the RMQ data structure

#include <cmath>
#include <cstdio>

#include <algorithm>

using namespace std;

const int MAXN = 100001;
const int MAXLOG = 20;

int n;
int A[MAXN];
int rmq[MAXN][MAXLOG];

void preproc()
{
    for (int i = 1; i <= n; ++i)
        rmq[i][0] = A[i];

    for (int j = 1; (1 << j) <= n; ++j)
        for (int i = 1; i + (1 << (j - 1)) <= n; ++i)
            rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}

int query(int x, int y)
{
    int k = (int) (log(y - x + 1) / log(2));
    
    return min(rmq[x][k], rmq[y - (1 << k) + 1][k]);
}

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

    int m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &A[i]);

    preproc();

    for (int i = 0; i < m; ++i) {
        int x, y;
        scanf("%d %d", &x, &y);
        printf("%d\n", query(x, y));
    }

    return 0;
}