Cod sursa(job #1797242)

Utilizator ionutpop118Pop Ioan Cristian ionutpop118 Data 4 noiembrie 2016 10:07:11
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>
using namespace std;
const int NMAX = 100000;
const int LGMAX = 16;

int rmq[LGMAX + 2][NMAX + 5];
int lg[NMAX + 5];

int minim(int a, int b)
{
    if (a < b)
        return a;
    return b;
}
int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int n, m, st, dr, mid;

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

    for (int i = 1, k = 0; i <= n; ++i)
    {
        if (i >= (2 << k))
            ++k;
        lg[i] = k;
    }

    for (int i = 1; i <= lg[n]; ++i)
        for (int j = 1; j <= n; ++j)
            if ((1 << i) <= j)
                rmq[i][j] = minim(rmq[i - 1][j], rmq[i - 1][j - (1 << (i - 1))]);

    for (int i = 1; i <= m; ++i)
    {
        scanf("%d %d", &st, &dr);
        mid = lg[dr - st + 1];
        printf("%d\n", minim(rmq[mid][dr], rmq[mid][st + (1 << mid) - 1]));
    }
    return 0;
}