Cod sursa(job #2802400)

Utilizator Horia14Horia Banciu Horia14 Data 18 noiembrie 2021 00:59:15
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

class SqrtDecomposition {
private:
    int* v;
    int* buckets;
    int arrSize;
    int bucketSize;

public:
    SqrtDecomposition(int arrSize) {
        this->arrSize = arrSize;
        bucketSize = sqrt(arrSize);
        v = new int[arrSize];
        buckets = new int[bucketSize + 1];
    }

    void addNumber(int i, int x) {
        v[i] = x;
    }

    void dividingIntoBuckets() {
        for(int i = 0; i < arrSize; ++i) {
            if(i % bucketSize == 0)
                buckets[i / bucketSize] = v[i];
            else
                buckets[i / bucketSize] = min(buckets[i / bucketSize], v[i]);
        }
    }

    int RMQ(int x, int y) {
        int minElem = v[x];
        int pos = x + 1;
        while(pos <= y) {
            if((pos % bucketSize == 0) && (pos + bucketSize <= y + 1)) {
                minElem = min(minElem, buckets[pos / bucketSize]);
                pos += bucketSize;
            }
            else {
                minElem = min(minElem, v[pos]);
                ++pos;
            }
        }

        return minElem;
    }

    ~SqrtDecomposition() {
        delete[] v;
        delete[] buckets;
    }
};

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    int n, m, x, y;
    fin >> n >> m;
    SqrtDecomposition* sqrtDec = new SqrtDecomposition(n);
    for(int i = 0; i < n; ++i) {
        fin >> x;
        sqrtDec->addNumber(i, x);
    }

    sqrtDec->dividingIntoBuckets();

    for(int i = 0; i < m; ++i) {
        fin >> x >> y;
        fout << sqrtDec->RMQ(x - 1, y - 1) << "\n";
    }

    delete sqrtDec;

    return 0;
}