RMQ_offline.cpp 438 B

1234567891011121314151617
  1. const int maxn = 1000;
  2. //This is a offline version of RMQ.
  3. //O(nlogn)
  4. int d[maxn][maxn];
  5. int n;
  6. void RMQ_init(const VI& A){
  7. int n = A.size();
  8. for (int i = 0; i < n; i++) d[i][0] = A[i];
  9. for (int j = 1; (1<<j) <= n; j++)
  10. for (int i = 0; i + (1<<j) -1 < n; i++)
  11. d[i][j] = min(d[i][j-1], d[i+ (1<<(j-1))][j-1]);
  12. }
  13. int RMQ_query(int L, int R) {
  14. int k = 0;
  15. while ( (1<<(k+1)) <= R-L+1) k++;
  16. return min(d[L][k], d[R-(1<<k)+1][k]);
  17. }