Pagini recente » Cod sursa (job #1221758) | Cod sursa (job #2430451) | Cod sursa (job #982581) | Cod sursa (job #185666) | Cod sursa (job #2802400)
#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;
}