Cod sursa(job #1813679)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 23 noiembrie 2016 10:31:02
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
/// Problema "Rmq" - InfoArena
#include <cstdio>
#include <algorithm>

#define in "rmq.in"
#define out "rmq.out"
#define NMAX (100000 + 7)
#define RAD 350
#define DIM (100000 + 7)

using namespace std;
int N, M, v[NMAX], a, b, batog[RAD], ct, poz;
char buff[DIM];

inline void goNext()
{
    ++poz;
    if(poz == DIM)
    {
        poz = 0;
        fread(buff, 1, DIM, stdin);
    }
}
void citeste(int &nr)
{
    nr = 0;
    while(buff[poz] < '0' || buff[poz] >= '9') goNext();
    while(buff[poz] <= '9' && buff[poz] >= '0')
    {
        nr = nr*10 + buff[poz] - '0';
        goNext();
    }
}

int main()
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    fread(buff, 1, DIM, stdin);
    for(int i = 0; i< RAD; ++i) batog[i] = NMAX;
    scanf("%d %d", &N, &M);
    //citeste(N);
    //citeste(M);
    for(int i = 1; i<= N; ++i)
    {
        scanf("%d", &v[i]);
        //citeste(v[i]);
        if(i%RAD == 0) ++ct;
        batog[ct] = min(batog[ct], v[i]);
    }
    for( ; M; --M)
    {
        scanf("%d %d", &a, &b);
        //citeste(a);
        //citeste(b);
        int sol = NMAX;
        if((a/RAD) == (b/RAD))
        {
            for(int i = a; i<= b; ++i)
            {
                sol = min(sol, v[i]);
            }
            printf("%d\n", sol);
            continue;
        }
        while(a%RAD)
        {
            sol = min(sol, v[a]);
            ++a;
        }
        while(b%RAD != (RAD-1))
        {
            sol = min(sol, v[b]);
            --b;
        }
        int tmp1 = a/RAD, tmp2 = b/RAD;
        for(int i = tmp1; i<= tmp2; ++i) sol = min(sol, batog[i]);
        printf("%d\n", sol);
    }
    return 0;
}