Alex_tz307

RMQ

Aug 16th, 2021
638
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAXN = 1e5 + 1;
  6. int pw2[18], lg2[MAXN], rmq[MAXN][17];
  7.  
  8. void compute_rmq(int n) {
  9.   pw2[0] = 1;
  10.   for (int i = 1; i <= n; ++i) {
  11.     if (i < 18)
  12.       pw2[i] = pw2[i - 1] * 2;
  13.     if (i > 1)
  14.       lg2[i] = lg2[i / 2] + 1;
  15.   }
  16.   for (int j = 1; pw2[j] <= n; ++j)
  17.     for (int i = 1; i + pw2[j] - 1 <= n; ++i)
  18.       rmq[i][j] = min(rmq[i][j - 1], rmq[i + pw2[j - 1]][j - 1]);
  19. }
  20.  
  21. int query_min(int st, int dr) {
  22.   int diff = dr - st + 1;
  23.   int k = lg2[diff];
  24.   int shift = diff - pw2[k];
  25.   return min(rmq[st][k], rmq[st + shift][k]);
  26. }
  27.  
  28. int main() {
  29.   ios_base::sync_with_stdio(false);
  30.   cin.tie(nullptr);
  31.   cout.tie(nullptr);
  32.   int n;
  33.   cin >> n;
  34.   for (int i = 1; i <= n; ++i)
  35.     cin >> rmq[i][0];
  36.   compute_rmq(n);
  37.   return 0;
  38. }
  39.  
Advertisement
Add Comment
Please, Sign In to add comment