Cod sursa(job #2097201)

Utilizator titusTitus A titus Data 30 decembrie 2017 18:24:41
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 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);
    k = 0; Min[0] = INF;
    for(i=1; i<=n; ++i){
        if (i % seg == 0) {
            ++k;
            Min[k] = INF;
        }
        Min[k] = min(Min[k], a[i]);
    }

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