Pagini recente » Cod sursa (job #2071482) | Cod sursa (job #1767700) | Istoria paginii runda/carnedecal/clasament | Cod sursa (job #1364241) | Cod sursa (job #742567)
Cod sursa(job #742567)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 100005;
int n, q, v[MAXN], bucati, elem, start[400], minim[400], minq, x, y;
int main()
{
int i, j, k;
freopen ("rmq.in", "r", stdin);
freopen ("rmq.out", "w", stdout);
scanf("%d %d", &n, &q);
for(i = 1; i <= n; ++i)
scanf("%d", &v[i]);
elem = (int)sqrt(n);
if(n % elem == 0)
bucati = n / elem;
else bucati = n / elem + 1;
for(i = 1; i <= bucati; ++i)
start[i] = 1 + (i - 1) * elem;
start[bucati + 1] = n + 1;
for(i = 1; i <= bucati; ++i) {
minim[i] = 1999999999;
for(j = start[i]; j <= start[i + 1] - 1; ++j)
if(v[j] < minim[i])
minim[i] = v[j];
}
for(i = 1; i <= q; ++i) {
scanf("%d %d", &x, &y);
minq = 0x3f3f3f3f;
for(j = 1; j <= bucati; ++j) {
if(start[j] >= x && start[j + 1] - 1 <= y)
minq = min(minq, minim[j]);
else if(start[j] < x && start[j + 1] - 1 <= y) {
for(k = x; k <= start[j + 1] - 1; ++k)
if(v[k] < minq)
minq = v[k];
}
else if(start[j] >= x && start[j + 1] - 1 > y) {
for(k = start[j]; k <= y; ++k)
if(v[k] < minq)
minq = v[k];
}
}
printf("%d\n", minq);
}
return 0;
}