Pagini recente » Cod sursa (job #2534336) | Cod sursa (job #1047596) | Cod sursa (job #2325380) | Cod sursa (job #649393) | Cod sursa (job #1066877)
#include <fstream>
#include <algorithm>
class RMQ {
int nV;
int *myL;
int **myM;
public:
RMQ(int *Arr, int x) : nV(x), myL(new int[nV + 1]) {
myL[1] = 0;
for(int i = 2; i <= nV; i++) {
myL[i] = myL[i >> 1] + 1;
}
myM = new int*[nV + 1];
for(int i = 0; i <= nV; i++) {
myM[i] = new int[myL[nV] + 1];
}
for(int i = 0; i <= nV; i++) {
for(int j = 0; j <= myL[nV]; j++) {
myM[i][j] = 0;
}
}
for(int i = 1; i <= nV; i++) {
myM[i][0] = Arr[i];
}
for(int j = 1; (1 << j) <= nV; j++) {
for(int i = 1; i + (1 << j) - 1 <= nV; i++) {
myM[i][j] = std::min(myM[i][j - 1], myM[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int a, int b) {
int aux = b - a + 1;
int search = aux - (1 << myL[aux]);
return std::min(myM[a][myL[aux]], myM[a + search][myL[aux]]);
}
~RMQ() {
delete[] myL;
for(int i = 0; i <= nV; i++) {
delete[] myM[i];
}
delete[] myM;
}
};
int main() {
std::ifstream in("rmq.in");
std::ofstream out("rmq.out");
int *Arr, nV, nOp;
in >> nV >> nOp;
Arr = new int[nV + 1];
for(int i = 1; i <= nV; i++) {
in >> Arr[i];
}
RMQ a(Arr, nV);
int x, y;
for(int i = 0; i < nOp; i++) {
in >> x >> y;
out << a.query(x, y) << '\n';
}
delete[] Arr;
return 0;
}