Advertisement
Alex_tz307

Clasa RMQ

Mar 15th, 2021 (edited)
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.67 KB | None | 0 0
  1. const int NMAX = 1e5 + 5;
  2. int lg2[NMAX];
  3.  
  4. void compute_lg2(int N) {
  5.   lg2[1] = 0;
  6.   for(int i = 2; i <= N; ++i)
  7.     lg2[i] = lg2[i >> 1] + 1;
  8. }
  9.  
  10. struct RMQ {
  11.   vector<vector<int>> rmq;
  12.  
  13.   void compute_rmq(int N) {
  14.     rmq = vector<vector<int>>(N + 1, vector<int>(lg2[N] + 1));
  15.     for(int i = 1; i <= N; ++i)
  16.       rmq[i][0] = a[i].y - a[i].x;
  17.     for(int j = 1; (1 << j) <= N; ++j)
  18.       for(int i = 1; i + (1 << j) - 1 <= N; ++i)
  19.         rmq[i][j] = max(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
  20.   }
  21.  
  22.   int query(int l, int r) {
  23.     int k = lg2[r - l + 1];
  24.     int diff = (r - l + 1) - (1 << k);
  25.     return max(rmq[l][k], rmq[l + diff][k]);
  26.   }
  27. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement