Cod sursa(job #598751)

Utilizator floringh06Florin Ghesu floringh06 Data 26 iunie 2011 22:22:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define MAX_N 100005
#define MAX_L 20

int d[MAX_N][MAX_L];

int main () {
    freopen ("rmq.in", "r", stdin);
    freopen ("rmq.out", "w", stdout);
    
    int N, M;
    scanf ("%d %d", &N, &M);
    for (int i = 0; i < N; ++i)
        scanf ("%d", d[i]);
        
    for (int j = 1; 1 << j <= N; ++j)
        for (int i = 0; i + (1 << j) <= N; ++i)
            if (d[i][j - 1] < d[i + (1 << (j - 1))][j - 1])
               d[i][j] = d[i][j - 1];
            else
               d[i][j] = d[i + (1 << (j - 1))][j - 1];
               
    for (int i = 0; i < M; ++i) {
        int a, b, pe;
        
        scanf ("%d %d", &a, &b); --a; --b;
        for (pe = 0; (1 << pe) <= b - a + 1; ++pe); --pe;
        if (d[a][pe] < d[b - (1 << pe) + 1][pe])
            printf ("%d\n", d[a][pe]);
        else
            printf ("%d\n", d[b - (1 << pe) + 1][pe]);
    }
}