Pagini recente » Cod sursa (job #620168) | Cod sursa (job #1768362) | Cod sursa (job #116835) | Cod sursa (job #353693) | Cod sursa (job #893692)
Cod sursa(job #893692)
// O(sqrt(N)) for each query
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 100001;
const int MAXSQ = 320;
int n;
int sqn;
int mins[MAXSQ];
int A[MAXN];
void preproc()
{
for (int i = 1; sqn * i <= n; ++i)
for (int j = sqn * (i - 1) + 1; j <= sqn * i; ++j)
mins[i] = min(mins[i], A[j]);
}
int query(int x, int y)
{
int id = 1;
while (sqn * id < x)
++id;
++id;
int lstop = min(sqn * (id - 1), y);
int res = INF;
while (sqn * id <= y) {
res = min(res, mins[id]);
++id;
}
int ustop = max(sqn * (id - 1), x);
for (int i = x; i <= lstop; ++i)
res = min(res, A[i]);
for (int i = ustop; i <= y; ++i)
res = min(res, A[i]);
return res;
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &A[i]);
while (sqn * sqn <= n)
++sqn;
sqn--;
memset(mins, 0x3f, sizeof(mins));
preproc();
for (int i = 0; i < m; ++i) {
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", query(x, y));
}
return 0;
}