Pagini recente » Cod sursa (job #693941) | Cod sursa (job #2481647) | Cod sursa (job #892216) | Cod sursa (job #67697) | Cod sursa (job #382161)
Cod sursa(job #382161)
#include <fstream>
using namespace std;
const int MAXN = 100005;
const int MAXLG = 17;
const int INF = 0x3f3f3f3f;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M;
int A[MAXN];
int RMQ[MAXLG][MAXN];
int Lev[MAXN];
void ReadData() {
fin >> N >> M;
for (int i = 1; i <= N; ++i)
fin >> A[i];
}
inline int min(int a, int b) { return (a < b ? a : b); }
void BuildRMQ() {
for (int i = 1; i <= N; ++i)
RMQ[0][i] = A[i];
for (int lev = 1; (1 << lev) <= N; ++lev)
for (int i = 1; i <= N; ++i)
RMQ[lev][i] = min(RMQ[lev-1][i], i + (1 << (lev-1)) <= N ? RMQ[lev-1][i + (1 << (lev-1))] : INF);
}
void BuildLev() {
for (int pow = 1, lev = 0, i = 1; i <= N; ++i) {
if ((pow << 1)== i) {
++lev;
pow <<= 1;
}
Lev[i] = lev;
}
}
void WriteData() {
for (int i = 0; i < M; ++i) {
int a, b;
fin >> a >> b;
fout << min(RMQ[Lev[b-a]][a], RMQ[Lev[b-a]][b- (1 << (Lev[b-a])) + 1]) << "\n";
}
}
int main() {
ReadData();
BuildRMQ();
BuildLev();
WriteData();
}