Cod sursa(job #742563)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 30 aprilie 2012 17:06:17
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

const int MAXN = 100005;
int n, q, v[MAXN], bucati, elem, start[400], minim[400], minq, x, y;

int main()
{
    int i, j, k;
    freopen ("rmq.in", "r", stdin);
    freopen ("rmq.out", "w", stdout);
    scanf("%d %d", &n, &q);
    for(i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    elem = (int)sqrt(n);
    if(n % elem == 0)
        bucati = n / elem;
    else bucati = n / elem + 1;
    for(i = 1; i <= bucati; ++i)
        start[i] = 1 + (i - 1) * elem;
    start[bucati + 1] = n + 1;
    for(i = 1; i <= bucati; ++i) {
        minim[i] = 1999999999;
        for(j = start[i]; j <= start[i + 1] - 1; ++j)
            if(v[j] < minim[i])
                minim[i] = v[j];
    }
    for(i = 1; i <= q; ++i) {
        scanf("%d %d", &x, &y);
        minq = 0x3f3f3f3f;
        for(j = 1; j <= bucati; ++j) {
            if(start[j] >= x && start[j + 1] - 1 <= y)
                minq = min(minq, minim[j]);
            else if(start[j] < x && start[j + 1] - 1 <= y)
                for(k = x; k <= start[j + 1] - 1; ++k)
                    if(v[k] < minq)
                        minq = v[k];
            else if(start[j] >= x && start[j + 1] - 1 > y)
                for(k = start[j]; k <= y; ++k)
                    if(v[k] < minq)
                        minq = v[k];
        }
        printf("%d\n", minq);
    }

    return 0;
}