Cod sursa(job #742736)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 1 mai 2012 10:44:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 100005;

int doi[31], aproape[MAXN], v[MAXN], n, q, p, d[31][MAXN], x, y;

int main()
{
    int i, j;
    freopen ("rmq.in", "r", stdin);
    freopen ("rmq.out", "w", stdout);
    for(i = 0; i <= 31; ++i)
        doi[i] = (1 << i);
    scanf("%d %d", &n, &q);
    for(i = 1; i <= n; ++i) {
        scanf("%d", &v[i]);
        d[0][i] = v[i];
    }
    for(i = 1; doi[i] <= n; ++i)
        for(j = 1; j <= n; ++j)
            d[i][j] = min(d[i - 1][j], d[i - 1][j + doi[i - 1]]);
    aproape[1] = 0;
    for(i = 1; i <= 50000; ++i)
        aproape[2 * i] = aproape[2 * i + 1] = aproape[i] + 1;
    for(i = 1; i <= q; ++i) {
        scanf("%d %d", &x, &y);
        p = aproape[y - x + 1];
        printf("%d\n", min(d[p][x], d[p][y - doi[p] + 1]));
    }

    return 0;
}