Alex_tz307

RMQ 2D

Feb 26th, 2021
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int NMAX = 212;
  6. const int lgmax = 8;
  7. int N, lg2[NMAX], rmq[lgmax][lgmax][NMAX][NMAX];
  8.  
  9. int query(int x1, int y1, int x2, int y2) {
  10.     int h1 = lg2[x2 - x1],
  11.         h2 = lg2[y2 - y1];
  12.     return min({rmq[h1][h2][x1][y1], rmq[h1][h2][x2 - (1 << h1) + 1][y1],
  13.                 rmq[h1][h2][x1][y2 - (1 << h2) + 1], rmq[h1][h2][x2 - (1 << h1) + 1][y2 - (1 << h2) + 1]});
  14. }
  15.  
  16. void test_case() {
  17.     cin >> N;
  18.     for(int i = 1; i <= N; ++i)
  19.         for(int j = 1; j <= N; ++j)
  20.             cin >> rmq[0][0][i][j];
  21.     for(int i = 2; i < NMAX; ++i)
  22.         lg2[i] = lg2[i >> 1] + 1;
  23.     for(int h1 = 0; h1 < lgmax; ++h1)
  24.         for(int h2 = 0; h2 < lgmax; ++h2)
  25.             if(h1 > 0 || h2 > 0)
  26.                 for(int i = 1; i <= N; ++i)
  27.                     for(int j = 1; j <= N; ++j)
  28.                         if(i + (1 << h1) - 1 <= N && j + (1 << h2) - 1 <= N)
  29.                             rmq[h1][h2][i][j] = query(i, j, i + (1 << h1) - 1, j + (1 << h2) - 1);
  30. }
  31.  
  32. int main() {
  33.     ios_base::sync_with_stdio(false);
  34.     cin.tie(nullptr);
  35.     cout.tie(nullptr);
  36.     int T = 1;
  37.     while(T--)
  38.         test_case();
  39. }
  40.  
Advertisement
Add Comment
Please, Sign In to add comment