Pagini recente » Cod sursa (job #1071303) | Cod sursa (job #106843) | Cod sursa (job #331519) | Cod sursa (job #238624) | Cod sursa (job #1427302)
#include <fstream>
#include <cmath>
#define MaxN 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M, sqrtN, v[MaxN], rmq[MaxN], k, r, l;
int min(int a, int b) {
return a < b ? a : b;
}
int main() {
fin >> N >> M;
for (sqrtN = 0; sqrtN * sqrtN <= N; ++sqrtN);
--sqrtN;
for (int i = 0; i < N; ++i) {
fin >> v[i];
if (i % sqrtN == 0) {
rmq[i / sqrtN] = v[i];
} else {
rmq[i / sqrtN] = min(v[i], rmq[i / sqrtN]);
}
}
for (int j = 0; j < M; ++j) {
fin >> l >> r;
--l; --r;
// fout << "boundaries:\t";
// fout << l << '\t' << r << '\n';
int minn = ~(1 << 31), i;
int sqrtLeftIndex = l / sqrtN;
int sqrtRightIndex = r / sqrtN;
// fout << "indexes traversed:\t";
for (i = l; i < (sqrtLeftIndex + 1) * sqrtN; ++i) {
// fout << i << ' ';
minn = min(minn, v[i]);
}
for (k = sqrtLeftIndex + 1; k < sqrtRightIndex; ++k) {
// fout << "[ " << k * sqrtN << ", " << (k + 1) * sqrtN - 1 << " ] ";
minn = min(minn, rmq[k]);
}
i = sqrtLeftIndex == sqrtRightIndex ? i : sqrtRightIndex * sqrtN;
for (; i <= r; ++i) {
//fout << i << ' ';
minn = min(minn, v[i]);
}
/*
fout << "\nsqrtRightIndex = " << sqrtRightIndex << '\n';
fout << "\nresult:\t";
*/
fout << minn << '\n';
}
return 0;
}