Cod sursa(job #2139300)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 22 februarie 2018 13:19:12
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n, m;
int sir[100005][20];

int log2(int x){
    int y = 1;
    int nr = 0;

    while(y < x){
        y <<= 1;
        nr++;
    }

    return nr - 1;
}

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

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

void construire(){
    int l = log2(n);

    for(int i = 1; i <= l; i++){
        for(int j = 0; j < n; j++){
            sir[i][j] = sir[i - 1][j];
            int x = j + (1 << (i - 1));

            if(x < n){
                sir[i][j] = min(sir[i][j], sir[i - 1][x]);
            }
        }
    }
//
//    for(int i = 0; i <= l; i++, printf("\n")){
//        for(int j = 0; j < n; j++){
//            printf("%d ", sir[i][j]);
//        }
//    }
}

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

    citire();
    construire();

    for(int k = 0; k < m; k++){
        int x, y;
        scanf("%d %d", &x, &y);
        x--;
        y--;

        int d = y - x + 1;
        int l = log2(d);

        int tmp1 = sir[l][x];
        int tmp2 = sir[l][y - (1 << l) + 1];

        printf("%d\n", min(tmp1, tmp2));
    }

    return 0;
}