Pagini recente » Cod sursa (job #3207365) | Borderou de evaluare (job #2627720) | Borderou de evaluare (job #2072150) | Borderou de evaluare (job #2572811) | Cod sursa (job #1926947)
#include <cstdio>
inline int abs(int x){return (x >= 0) ? x : -x;}
inline int min(int a, int b){return (a < b) ? a : b;}
int numbers, queries, left, right;
int sequence[100001], sparseMatrix[18][100001];
int logarithm[100001];
int main(){
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &numbers, &queries);
for(int i = 1; i <= numbers; i++){
scanf("%d", &sequence[i]);
}
//Preprocessing
for(int i = 1; i <= numbers; i++){
sparseMatrix[0][i] = sequence[i];
}
for(int j = 1; (1 << j) < numbers; j++){
for(int i = 1; i <= numbers; i++){
sparseMatrix[j][i] = min(sparseMatrix[j - 1][i], sparseMatrix[j - 1][i + (1 << (j - 1))]);
}
}
//Queries
for(int i = 2; i <= numbers; i++){
logarithm[i] = logarithm[i >> 1] + 1;
}
for(int i = 1; i <= queries; i++){
scanf("%d %d", &left, &right);
int k = logarithm[abs(left - right)];
printf("%d\n", min(sparseMatrix[k][left], sparseMatrix[k][right - (1 << k) + 1]));
}
return 0;
}