Cod sursa(job #1463320)

Utilizator akaprosAna Kapros akapros Data 20 iulie 2015 17:59:34
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define inf 100002
#define Rmax 318
using namespace std;
int n, i, j, m, x, y, q, r, w[Rmax], X, Y, v[inf];
int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    scanf("%d %d", &n, &q);
    r = sqrt(n);
    for (i = 0; i <= r; ++ i)
        w[i] = inf;
    for (i = 0; i < n; ++ i)
    {
        scanf("%d", &v[i]);
        w[i / r] = min(w[i / r], v[i]);
    }
    while (q -- )
    {
        scanf("%d %d", &x, &y);
        -- x;
        -- y;
        int vmin = inf;
        int b = (x / r) + 1, e = y / r;
        if (b > e)
        {
            for (i = x; i <= y; ++ i)
                vmin = min(vmin, v[i]);
            printf("%d\n", vmin);
            continue;
        }
        for (i = b; i <= e; ++ i)
            vmin = min(vmin, w[i]);
        for (i = x; i < b * r; ++ i)
            vmin = min(vmin, v[i]);
        for (i = e * r + 1; i <= y; ++ i)
            vmin = min(vmin, v[i]);
        printf("%d\n", vmin);
    }
    return 0;
}