Advertisement
danielvitor23

Yet Another Median Task

Jun 19th, 2021 (edited)
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAX = 810;
  4.  
  5. int b[MAX][MAX];
  6.  
  7. void add(int x, int y, int val) {
  8.     for (int i = x; i < MAX; i += (i & -i)) {
  9.         for (int j = y; j < MAX; j += (j & -j)) {
  10.             b[i][j] += val;
  11.         }
  12.     }
  13. }
  14.  
  15. int sum(int x, int y) {
  16.     int ret = 0;
  17.     for (int i = x; i > 0; i -= (i & -i)) {
  18.         for (int j = y; j > 0; j -= (j & -j)) {
  19.             ret += b[i][j];
  20.         }
  21.     }
  22.     return ret;
  23. }
  24.  
  25. int query(int x1, int y1, int x2, int y2) {
  26.     return sum(x2, y2)-sum(x1-1, y2)-sum(x2, y1-1)+sum(x1-1, y1-1);
  27. }
  28.  
  29. int getSize(int x1, int y1, int x2, int y2) {
  30.     return (x2-x1+1)*(y2-y1+1);
  31. }
  32.  
  33. int n, q, ans[1010];
  34. int gr[MAX][MAX];
  35. vector<pair<int, pair<int, int>>> order;
  36. vector<pair<int, pair<pair<int, int>, pair<int, int>>>> queries;
  37.  
  38. void solve(int l, int r, vector<int> &v) {
  39.     if (l == r) {
  40.         for (int x : v) {
  41.             ans[x] = order[l].first;
  42.         }
  43.         return;
  44.     }
  45.     int mid = (l+r)/2;
  46.     for (int k = l; k <= mid; ++k) {
  47.         auto [i, j] = order[k].second;
  48.         add(i, j, 1);
  49.     }
  50.     vector<int> left, right;
  51.     for (int x : v) {
  52.         auto [x1, y1] = queries[x].second.first;
  53.         auto [x2, y2] = queries[x].second.second;
  54.         int ss = query(x1, y1, x2, y2);
  55.         int sz = getSize(x1, y1, x2, y2);
  56.         if (ss >= sz-ss) {
  57.             left.push_back(x);
  58.         } else {
  59.             right.push_back(x);
  60.         }
  61.     }
  62.     solve(mid+1, r, right);
  63.     for (int k = l; k <= mid; ++k) {
  64.         auto [i, j] = order[k].second;
  65.         add(i, j, -1);
  66.     }
  67.     solve(l, mid, left);
  68. }
  69.  
  70. int main() {
  71.     cin.tie(0)->sync_with_stdio(0);
  72.     cin >> n >> q;
  73.     for (int i = 1; i <= n; ++i) {
  74.         for (int j = 1; j <= n; ++j) {
  75.             cin >> gr[i][j];
  76.             order.push_back({gr[i][j], {i, j}});
  77.         }
  78.     }
  79.     sort(order.begin(), order.end());
  80.     for (int i = 0, x1, y1, x2, y2; i < q; ++i) {
  81.         cin >> x1 >> y1 >> x2 >> y2;
  82.         queries.push_back({i, {{x1, y1}, {x2, y2}}});
  83.     }
  84.     vector<int> v(q);
  85.     iota(v.begin(), v.end(), 0);
  86.     solve(0, n*n-1, v);
  87.     for (int i = 0; i < q; ++i) {
  88.         cout << ans[i] << '\n';
  89.     }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement