Cod sursa(job #1602494)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 16 februarie 2016 20:02:15
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

#define DIM 100005

int rmq[20][DIM], N, Q, lungimi[DIM], x, y;

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

    scanf("%d %d\n", &N, &Q);

    for(int i = 1; i <= N; ++i) {
        scanf("%d\n", &rmq[0][i]);
    }

    lungimi[1] = 0;

    for(int i = 2; i <= N; ++i) {
        lungimi[i] = lungimi[i / 2] + 1;
    }

    for(int i = 1; (1 << i) <= N; ++i) {
        for(int j = 1; j <= N - (1 << i) + 1; ++j) {
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
        }
    }

    while(Q) {
        --Q;

        scanf("%d %d\n", &x, &y);

        int s = y - x + 1 - (1 << (lungimi[y - x + 1]));

        cout << min(rmq[lungimi[y - x + 1]][x], rmq[lungimi[y - x + 1]][x + s]) << '\n';
    }

    return 0;
}