Cod sursa(job #2139314)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 22 februarie 2018 13:31:08
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

int n, m;
int sir[20][100005];
//
//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];

//        if(d == 1){
//            tmp1 = tmp2 = sir[0][x];
//        }

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

    return 0;
}