Pagini recente » Cod sursa (job #2155683) | Cod sursa (job #2856744) | Istoria paginii runda/o_0/clasament | Istoria paginii runda/pregatire.banal | Cod sursa (job #1784771)
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 100001
#define SNMAX 317
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int A[NMAX], A_MIN[SNMAX];
int n, m;
void Update(int B)
{
int L = sqrt(n);
int minim = A[B*L + 1];
for (int i = B*L + 1; i <= (B + 1) * L && i <= n; ++i)
minim = min(minim, A[i]);
A_MIN[B + 1] = minim;
}
int main()
{
in >> n >> m;
for (int i = 1; i <= n; ++i)
in >> A[i];
int L = sqrt(n);
int length = L;
if (double(L) < sqrt(n))
L++;
for (int i = 1; i <= L; ++i)
Update(i - 1);
int x, y, minn;
for (int i = 1; i <= m; ++i)
{
in >> x >> y;
minn = A[x];
for (int j = x; j <= y; j++)
{
if ((j - 1) % length == 0 && x + length - 1 <= y)
{
if (minn > A_MIN[(j - 1) / length + 1])
minn = A_MIN[(j - 1) / length + 1];
j += length - 1;
}
else
{
if (minn > A[j])
minn = A[j];
}
}
out << minn << "\n";
}
in.close();
out.close();
return 0;
}