Cod sursa(job #1118998)

Utilizator visanrVisan Radu visanr Data 24 februarie 2014 14:23:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

const int NMAX = 100010;

int N, M, V[NMAX], RMQ[18][NMAX], X, Y;

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

    scanf("%i %i", &N, &M);
    for(int i = 1; i <= N; ++ i) scanf("%i", &V[i]);

    for(int i = 1; i <= N; ++ i) RMQ[0][i] = V[i];
    for(int i = 1; (1 << i) <= N; ++ i)
        for(int j = 1; j <= N; ++ j)
            RMQ[i][j] = min(RMQ[i - 1][j], RMQ[i - 1][j + (1 << (i - 1))]);

    for(; M; M --)
    {
        scanf("%i %i", &X, &Y);
        int Log = int(log2(Y - X + 1));
        printf("%i\n", min(RMQ[Log][X], RMQ[Log][Y - (1 << Log) + 1]));
    }
}