Pagini recente » Cod sursa (job #940619) | Cod sursa (job #2272396) | Cod sursa (job #1393807) | Cod sursa (job #3287339) | Cod sursa (job #633408)
Cod sursa(job #633408)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAXN 100000
#define INF 100000;
int N, M;
int A[MAXN];
void solve_simple(int *A, int N, int M) {
int x, y;
long S[1000];
long ind[1000];
memset(S, 100000, 1000*sizeof( long));
memset(ind, 0, 1000*sizeof( long));
int d = floor(sqrt(N));
int splits;
for (int s = 0, i = 0; s < N-d; s += d, i++) {
ind[i] = s;
ind[i+1]=N;
splits = i+1;
}
for (int i = 0; i < splits; i++) {
S[i] = INF;
for (int j = ind[i]; j < ind[i+1]; j++) {
if (S[i] > A[j]) {
S[i] = A[j];
}
}
}
S[splits] = INF;
for (int t=0; t<M; t++) {
scanf("%d %d\n", &x, &y);
x--,y--;
int start, stop;
for (int i = 0; i < splits; i++) {
if (ind[i] > x) {
start = i;
break;
}
}
for (int i = splits-1; i >= 0; i--) {
if (y > ind[i]) {
stop = i-1;
break;
}
}
int min = INF;
if (stop <= start) {
for (int i = x; i <= y; i++) {
if (A[i] < min) {
min = A[i];
}
}
} else {
for (int i = start; i <= stop; i++) {
if (S[i] < min) {
min = S[i];
}
}
for (int i = x; i < ind[start+1]; i++) {
if (A[i] < min) {
min = A[i];
}
}
for (int i = ind[stop-1]; i <= y; i++) {
if (A[i] < min) {
min = A[i];
}
}
}
printf("%d\n", min);
}
}
int main() {
freopen("rmq.in", "rt", stdin);
freopen("rmq.out", "wt", stdout);
scanf("%d %d\n", &N, &M);
for (int i = 0; i < N; i++) {
scanf("%d\n", &A[i]);
}
solve_simple(&A[0], N, M);
return 0;
}