Cod sursa(job #2097177)

Utilizator titusTitus A titus Data 30 decembrie 2017 17:47:02
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
/// 30 p
# include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

int a[100003], Min[100003];
int n, q;

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

    int i, j, k;
    scanf("%d %d", &n, &q);
    for(i=1; i<=n; ++i)
        scanf("%d", &a[i]);

    /// retinem minimul pe bucati de sqrt(n)
    int seg = sqrt(n);
    for(i=1; i*seg<=n; ++i){
        Min[i] = INF;
        for(j=seg*(i-1) + 1; j<=seg * i; ++j)
            if (a[j] < Min[i]) Min[i] = a[i];
    }

    while (q--){
        scanf("%d %d", &i, &j);
        int m = INF;
        k = i;
        while (k <= i) {
            if ((k % seg == 0) && (k + seg <= j + 1)) {
                m = min(m, Min[k / seg]);
                k += seg;
            } else {
                m = min(m, a[k]);
                ++k;
            }
        }
        printf("%d\n", m);
    }
    return 0;
}