Cod sursa(job #1868747)

Utilizator giotoPopescu Ioan gioto Data 5 februarie 2017 12:18:32
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>
using namespace std;

int x, y, n, q, a[100005], lg[100005], rmq[31][100005];
inline int min(int x, int y){
    return (x < y) ? x : y;
}
int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n ; ++i)
        scanf("%d", &a[i]);
    for(int i = 1; i <= n ; ++i)
        rmq[0][i] = a[i];
    for(int j = 1; (1 << j) <= n ; ++j){
        for(int i = 1; i <= n - (1 << j) + 1; ++i){
            rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
        }
    }
    for(int i = 2; i <= n ; ++i)
        lg[i] = lg[i / 2] + 1;
    for(int i = 1; i <= q ; ++i){
        scanf("%d%d", &x, &y);
        int d = y - x + 1, l = lg[d];
        int sh = d - (1 << l);
        printf("%d\n", min(rmq[l][x], rmq[l][x + sh]));
    }
    return 0;
}