Advertisement
Anon2005

miex

May 3rd, 2023
663
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #pragma GCC optimize("Ofast")
  3. using namespace std;
  4.  
  5. int aib2d[501][501], n, m;
  6.  
  7. int lsb(int x)
  8. {
  9.     return x & -x;
  10. }
  11.  
  12. void update(int x, int y, int val)
  13. {
  14.     for(; x <= n; x += lsb(x))
  15.         for(int y1 = y; y1 <= m; y1 += lsb(y1))
  16.             aib2d[x][y1] ^= val;
  17. }
  18.  
  19. int query(int x, int y)
  20. {
  21.     int s = 0;
  22.     for(; x > 0; x -= lsb(x))
  23.         for(int y1 = y; y1 > 0; y1 -= lsb(y1))
  24.             s ^= aib2d[x][y1];
  25.     return s;
  26. }
  27.  
  28. vector <int> interes[250001];
  29. vector <pair <int, int>> poz[250001];
  30. int cod[250001];
  31. int check[250001];
  32.  
  33. struct querr{
  34.     int x1, y1, x2, y2;
  35.     int ind, rasp;
  36. }que[20001];
  37.  
  38. int main()
  39. {
  40. #ifdef HOME
  41.     freopen("test.in", "r", stdin);
  42.     freopen("test.out", "w", stdout);
  43. #endif // HOME
  44. #ifndef HOME
  45.     freopen("miex.in", "r", stdin);
  46.     freopen("miex.out", "w", stdout);
  47. #endif // HOME
  48.     mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  49.     //srand(time(NULL));
  50.     ios_base::sync_with_stdio(false);
  51.     cin.tie(NULL);
  52.     cout.tie(NULL);
  53.     int x;
  54.     cin >> n >> m;
  55.     for(int i = 1; i <= n; i++)
  56.         for(int j = 1; j <= m; j++)
  57.         {
  58.             cin >> x;
  59.             poz[x].push_back({i, j});
  60.         }
  61.     for(int i = 1; i <= n * m; i++)
  62.     {
  63.         cod[i] = rng();
  64.         check[i] = check[i - 1] ^ cod[i];
  65.     }
  66.     int q;
  67.     cin >> q;
  68.     for(int i = 1; i <= q; i++)
  69.     {
  70.         cin >> que[i].x1 >> que[i].y1 >> que[i].x2 >> que[i].y2;
  71.         que[i].ind = i;
  72.         que[i].rasp = 0;
  73.     }
  74.     for(int pas = 1 << 19; pas > 0; pas /= 2)
  75.     {
  76.         for(int i = 1; i <= q; i++)
  77.             if(que[i].rasp + pas <= n * m)
  78.                 interes[que[i].rasp + pas].push_back(i);
  79.         for(int i = 1; i <= n * m; i++)
  80.         {
  81.             for(auto it:poz[i])
  82.                 update(it.first, it.second, cod[i]);
  83.             for(auto it:interes[i])
  84.                 if((query(que[it].x2, que[it].y2) ^ query(que[it].x1 - 1, que[it].y2) ^ query(que[it].x2, que[it].y1 - 1) ^ query(que[it].x1 - 1, que[it].y1 - 1)) == check[i])
  85.                     que[it].rasp += pas;
  86.             interes[i].clear();
  87.         }
  88.         for(int i = 1; i <= n; i++)
  89.             for(int j = 1; j <= m; j++)
  90.                 aib2d[i][j] = 0;
  91.     }
  92.     for(int i = 1; i <= q; i++)
  93.         cout << que[i].rasp + 1<< '\n';
  94.     return 0;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement