Pagini recente » Cod sursa (job #2221188) | Cod sursa (job #2107934) | Cod sursa (job #1663057) | Cod sursa (job #1907677) | Cod sursa (job #531050)
Cod sursa(job #531050)
#include<cstdio>
using namespace std;
#define NMAX 200001
#define LOGMAX 19
int rmq[LOGMAX][NMAX];
int N;
int min(int a, int b) {
return a > b ? b : a;
}
void buildTable() {
int P, i, j;
for (i = 1; i < N; i++) {
rmq[1][i] = min(rmq[0][i], rmq[0][i+1]);
}
for (P = 2, j = 2; P <= N; P<<=1, j++) {
for (i = 1; i <= N-P; i++) {
rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i+(P>>1)]);
}
}
}
int getMin(int start, int end) {
if (start == end) return rmq[0][start];
if (start + 1 == end) return rmq[1][start];
int P = 1;
int i = 1;
while (P + start < end) {
P <<= 1;
i++;
}
if (P+start > end)
{
i--;
P>>=1;
return min(rmq[i][start], rmq[i][end - P]);
}
else return rmq[i][start];
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int M;
scanf("%d %d", &N, &M);
int i;
for (i = 1; i <= N; i++) {
scanf("%d", &rmq[0][i]);
}
buildTable();
int a,b;
for (i = 0; i < M; i++) {
scanf ("%d %d", &a, &b);
printf("%d\n", getMin(a,b));
}
return 0;
}