Pagini recente » Cod sursa (job #175184) | Cod sursa (job #1975939) | Cod sursa (job #468567) | Cod sursa (job #1338461) | Cod sursa (job #2803360)
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define MAX_V 1000000
#define MAX_N 100000
const int SQ_N = sqrt(MAX_N);
const int BATOG_SIZE = (MAX_N + SQ_N - 1) / SQ_N;
int v[MAX_N];
int vLength;
int batog[BATOG_SIZE];
void build() {
int i;
for (i = 0; i < BATOG_SIZE; ++i)
batog[i] = MAX_V;
for (i = 0; i < vLength; ++i)
batog[i / SQ_N] = min(batog[i / SQ_N], v[i]);
}
inline void update(int pos, int value) {
batog[pos / SQ_N] += value - v[pos];
v[pos] = value;
}
int query(int left, int right) {
int firstInterval, lastInterval, mmin;
firstInterval = (left + SQ_N - 1) / SQ_N * SQ_N;
lastInterval = right / SQ_N * SQ_N;
mmin = MAX_V;
while (left <= right && left < firstInterval)
mmin = min(mmin, v[left++]);
while (right >= left && right >= lastInterval)
mmin = min(mmin, v[right--]);
firstInterval /= SQ_N;
lastInterval /= SQ_N;
while (firstInterval < lastInterval)
mmin = min(mmin, batog[firstInterval++]);
return mmin;
}
int main() {
FILE *fin, *fout;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
int i, q, a, b;
fscanf(fin, "%d%d", &vLength, &q);
for (i = 0; i < vLength; ++i)
fscanf(fin, "%d", &v[i]);
build();
while (q--) {
fscanf(fin, "%d%d", &a, &b);
--a, --b;
fprintf(fout, "%d\n", query(a, b));
}
fclose(fin);
fclose(fout);
return 0;
}