Cod sursa(job #1919777)

Utilizator victorpapa98Papa Victor-Alexandru victorpapa98 Data 9 martie 2017 21:01:23
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
# include <cstdio>
# include <algorithm>
using namespace std;

FILE *f = freopen("rmq.in", "r", stdin);
FILE *g = freopen("rmq.out", "w", stdout);

const int N_MAX = 100010;

int v[N_MAX];
int rmq[20][N_MAX]; /// maximul de la j la j + 2^i - 1
int lg[N_MAX];

int n, m;

void read(){
    scanf("%d %d", &n, &m);

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

void solve(){

    lg[2] = 1;

    for (int i=3; i<=n; i++)
        lg[i] = lg[i/2] + 1;

    for (int i=1; (1<<i) <= n ; i ++){
        for (int j=1; j + (1<<i) - 1 <= n; j++){
            rmq[i][j] = rmq[i-1][j];

            if (rmq[i-1][j+1] < rmq[i][j])
                rmq[i][j] = rmq[i-1][j+1];
        }
    }
}

void answer_queries(){
    for (int i=1; i<=m; i++){
        int x, y;
        scanf("%d %d", &x, &y);

        int max_dist = y - x;
        int log = lg[max_dist];

        printf("%d\n", min(rmq[log][x], rmq[log][x + (1<<(log - 1))]));
    }
}

int main(){

    read();
    solve();
    answer_queries();
    return 0;
}