Pagini recente » Cod sursa (job #829531) | Istoria paginii calibrare-limite-de-timp | Cod sursa (job #710738) | Cod sursa (job #1839141) | Cod sursa (job #1784799)
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 100001
#define SNMAX 317
#define BUFF_SIZE 100001
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int A[NMAX], A_MIN[SNMAX];
int n, m;
char BUFF[BUFF_SIZE];
int pos = 0;
void Read(int &a)
{
while (!isdigit(BUFF[pos]))
if (++pos == BUFF_SIZE)
in.read(BUFF, BUFF_SIZE), pos = 0;
a = 0;
while (isdigit(BUFF[pos]))
{
a = a * 10 + (BUFF[pos] - '0');
if (++pos == BUFF_SIZE)
in.read(BUFF, BUFF_SIZE), pos = 0;
}
}
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()
{
Read(n); Read(m);
for (int i = 1; i <= n; ++i)
Read(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)
{
Read(x); Read(y);
minn = A[x];
for (int j = x; j <= y; j++)
{
if ((j - 1) % length == 0 && j + 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;
}