Pagini recente » Cod sursa (job #1290548) | Cod sursa (job #496468) | Cod sursa (job #3202391) | Cod sursa (job #692564) | Cod sursa (job #1784784)
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define min(a,b) ((a) < (b) ? (a) : (b))
using namespace std;
FILE *f = fopen("rmq.in", "r");
FILE *g = fopen("rmq.out", "w");
int n, l, m, *v, *B;
void UpdateMin(int b)
{
int minim = v[b * l];
if(b < l)
{
for (int i = b * l + 1; i < (b + 1) * l; ++i)
minim = min(minim, v[i]);
}
else if (b == l && n > l * l)
{
for (int i = b * l; i < n; ++i)
minim = min(minim, v[i]);
}
B[b] = minim;
}
int main()
{
fscanf(f, "%d %d", &n, &m);
v = (int*)calloc(n + 1, sizeof(int));
l = sqrt((double)n);
B = (int*)calloc(l + 1, sizeof(int));
for (int i = 0; i < n; ++i)
fscanf(f, "%d", &v[i]);
for (int i = 0; i <= l; ++i)
UpdateMin(i);
for (int i = 0; i < m; ++i)
{
int x, y, minim;
fscanf(f, "%d %d", &x, &y);
x--;
y--;
minim = v[x];
while (x <= y)
{
while (x <= y && (x % l != 0 || x >= l * l))
{
minim = min(v[x], minim);
x++;
}
while ((y + 1) >= l * x)
{
minim = min(B[x / l], minim);
x += l;
}
}
fprintf(g, "%d\n", minim);
}
return 0;
}