Pagini recente » Cod sursa (job #1420404) | Cod sursa (job #1402135) | Cod sursa (job #2935776) | Cod sursa (job #2914228) | Cod sursa (job #633506)
Cod sursa(job #633506)
#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_st(int N, int M) {
int K=0;
int p = 1;
while (p < N) p*=2, K++;
int B[N][K];
for (int i = 0; i < N; i++) {
B[i][0] = i;
}
for (int j = 1; 1 << j <= N; j++) {
for (int i = 0; i + (1 << j) - 1 < N; i++) {
if (A[B[i][j-1]] <= A[B[i + (1 << (j-1))][j-1]])
B[i][j] = B[i][j-1];
else
B[i][j] = B[i + (1 << (j-1))][j-1];
}
}
/*
for (int i = 0; i < N; i++) {
for (int j = 0; (1 << j) < N; j++) {
printf("%d ", B[i][j]);
}
printf("\n");
}
*/
int x, y;
for (int t = 0; t < M; t++) {
scanf("%d %d\n", &x, &y);
x--,y--;
int k = 1;
while((1 << k) < (y-x+1)) k++;
k--;
int answer;
if (A[B[x][k]] <= A[B[y-(1 << k)+1][k]])
answer = A[B[x][k]];
else
answer = A[B[y-(1<<k)+1][k]];
printf("%d\n", answer);
}
}
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_st(N, M);
return 0;
}