Cod sursa(job #2240440)

Utilizator iondodon1998Dodon Ion iondodon1998 Data 13 septembrie 2018 13:16:13
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <stdio.h>
#include <tgmath.h>

namespace common{
    #define N_MAX 100000
    int N, M, collums;

    inline int minimum(int a, int b){
        return (a < b) ? a : b;
    }

    inline int twoToPower(int power){
        int result = 1;
        for(int i = 0; i < power; i++){
            result *= 2;
        }
        return result;
    }
};

class RMQSparseTable{
private:
    //log(N_MAX) + 1 = 6
    int sparse[N_MAX][6];
    int input[N_MAX];

    void constructSparseTable(){
        common::collums = (int)floor(log((double)common::N)) + 1;

        for(int i = 0; i < common::N; i++){
            scanf("%d", &input[i]);
            sparse[i][0] = i;
        }

        for(int j = 1; j <= common::collums; j++){
            for(int i = 0; i+common::twoToPower(j)-1 < common::N; i++){
                if(input[sparse[i][j-1]] < input[sparse[i+common::twoToPower(j-1)][j-1]]){
                    sparse[i][j] = sparse[i][j-1];
                } else {
                    sparse[i][j] = sparse[i+common::twoToPower(j-1)][j-1];
                }
            }
        }
    }

public:
    RMQSparseTable(){
        constructSparseTable();
    }

    int rmq(int left, int right){
        int l = right - left + 1;
        int k = (int)floor(log(l));
        return common::minimum(input[sparse[left][k]], input[sparse[left+l-common::twoToPower(k)][k]]);
    }
};

class Master{
private:
    RMQSparseTable *rmqSparseTable;

public:
    Master(){
        freopen("rmq.in", "r", stdin);
        freopen("rmq.out", "w", stdout);
        scanf("%d%d", &(common::N), &(common::M));
        rmqSparseTable = new RMQSparseTable;
        for (int i = 0, left, right; i < common::M; ++i) {
            scanf("%d%d", &left, &right);
            printf("%d\n", rmqSparseTable->rmq(left-1, right-1));
        }
    }
    
    ~Master(){
        delete rmqSparseTable;
    }
};

int main(){
    Master *master = new Master;
    delete master;
    return 0;
}