Pagini recente » Cod sursa (job #1673386) | Calibrare limite de timp | Cod sursa (job #597665) | Cod sursa (job #1910893) | Cod sursa (job #1785660)
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 100001
#define SMAX 317
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int A[NMAX], n, m, poz[NMAX];
int A_MIN[SMAX], dx[SMAX], dy[SMAX];
int main()
{
in >> n >> m;
for (int i = 1; i <= n; ++i)
in >> A[i];
int piece, length = sqrt(n);
int L = length;
if ((double) L < sqrt(n))
L++;
for (int i = 0; i < L - 1; ++i)
{
A_MIN[i] = NMAX;
dx[i] = i * length + 1;
dy[i] = dx[i] + length - 1;
}
A_MIN[L - 1] = NMAX;
dx[L - 1] = (L - 1) * length + 1;
dy[L - 1] = n;
for (int i = 1; i <= n; ++i)
{
piece = (i - 1) / length;
A_MIN[piece] = min(A_MIN[piece], A[i]);
poz[i] = piece;
}
int x, y, minn, bucx, bucy;
for (int i = 1; i <= m; ++i)
{
in >> x >> y;
bucx = poz[x];
bucy = poz[y];
minn = A[x];
if (bucx != bucy)
{
for (int j = x; j <= dy[bucx]; ++j)
minn = min(minn, A[j]);
for (int j = dx[bucy]; j <= y; ++j)
minn = min(minn, A[j]);
}
else
for (int j = x; j <= y; ++j)
minn = min(minn, A[j]);
for (int j = bucx + 1; j < bucy; ++j)
minn = min(minn, A_MIN[j]);
out << minn << "\n";
}
in.close();
out.close();
return 0;
}