Cod sursa(job #2360573)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 1 martie 2019 22:22:32
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
#include <iostream>
#include <cmath>

#define NMAX 100005
using namespace std;

int M[400];
int v[NMAX], nrG;

int getMin(int st, int dr, int rad){
    int minn = (1 << 30);
    for(int i = st; i <= dr; ++i){
        if((i - 1) % rad == 0){
            minn = min(minn, M[i / rad + 1]);
            i += rad;
            --i;
        }
        else
            minn = min(minn, v[i]);

    }
    return minn;
}

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    int n, k;
    scanf("%d%d", &n, &k);

    int minn = (1 << 30);
    int r = sqrt(n);
    int nr = 0;
    for(int i = 1; i <= n; ++i){
        scanf("%d", &v[i]);

        minn = min(minn, v[i]);
        ++nr;
        if(nr == r){
            M[++nrG] = minn;
            minn = (1 << 30);
            nr = 0;
        }
    }

    if(nr != 0)
        M[++nrG] = minn;

    for(int i = 1; i <= k; ++i){
        int st, dr;
        scanf("%d%d", &st, &dr);

        printf("%d\n", getMin(st, dr, r));
    }
    return 0;
}