Cod sursa(job #188920)

Utilizator sandyxpSanduleac Dan sandyxp Data 10 mai 2008 21:15:42
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <cmath>

#define _name_ "rmq"
#define FIN _name_".in"
#define FOUT _name_".out"
#define MAXN 100001

int n, m;
int B[17][MAXN];
int Log[MAXN];
int p2[20];

inline int min(int a, int b) {
    return a<b ? a : b;
}

void init()
{
    p2[0] = 1;
    for (int i = 1; i < 20; ++i)
        p2[i] = p2[i-1] * 2;
    for (int i = 1, j = 1, k = 0; i <= n; ++i) {
        Log[i] = k;
        if (i == j) j *= 2, k++;
    }
}

void solvim()
{
    int i, j, step;
    for (i = step = 1; step < n; ++i, step *= 2) {
        int lim = n-2*step+1;
        for (j = 1; j <= lim; ++j) {
            B[i][j] = min(B[i-1][j], B[i-1][j+step]);
        }
    }
}

void afish()
{
    for (int i = 0; i < m; ++i) {
        int x, y;
        scanf("%d %d", &x, &y);
        int len = (y-x+1), llen = Log[len];
        printf("%d\n", min(B[llen][x], B[llen][y - p2[llen] + 1]));
    }
}

void citirea()
{
    freopen(FIN, "r", stdin);
    freopen(FOUT,"w",stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", B[0]+i);
    }
}

int main()
{
    init();
    citirea();
    solvim();
    afish();
    return 0;
}