Advertisement
Alex_tz307

RMQ normal

Feb 26th, 2021
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1.    
  2. vector<int> a, lg2;
  3. vector<vector<int>> rmq_min, rmq_max;
  4.  
  5. void compute_lg2() {
  6.     lg2 = vector<int>(N + 1);
  7.     lg2[1] = 0;
  8.     for(int i = 2; i <= N; ++i)
  9.         lg2[i] = lg2[i >> 1] + 1;
  10. }
  11.  
  12. void compute_rmq() {
  13.     rmq_min = vector<vector<int>>(N + 1, vector<int>((int)log2(N) + 1, INF));
  14.     rmq_max = vector<vector<int>>(N + 1, vector<int>((int)log2(N) + 1));
  15.     for(int i = 1; i <= N; ++i)
  16.         rmq_min[i][0] = rmq_max[i][0] = a[i];
  17.     for(int j = 1; (1 << j) <= N; ++j)
  18.         for(int i = 1; i + (1 << j) - 1 <= N; ++i) {
  19.             rmq_min[i][j] = min(rmq_min[i][j - 1], rmq_min[i + (1 << (j - 1))][j - 1]);
  20.             rmq_max[i][j] = max(rmq_max[i][j - 1], rmq_max[i + (1 << (j - 1))][j - 1]);
  21.         }
  22. }
  23.  
  24. int query_min(int l, int r) {
  25.     int k = lg2[r - l + 1];
  26.     int dif = (r - l + 1) - (1 << k);
  27.     return min(rmq_min[l][k], rmq_min[l + dif][k]);
  28. }
  29.  
  30. int query_max(int l, int r) {
  31.     int k = lg2[r - l + 1];
  32.     int dif = (r - l + 1) - (1 << k);
  33.     return max(rmq_max[l][k], rmq_max[l + dif][k]);
  34. }
  35.  
  36. // in main() trebuie apelate compute_lg2() si compute_rmq()!!!!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement