erek1e

(Andrew) Plundering Pirates - BIO 2025 Round 2

Apr 24th, 2025
435
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define sz(x) (int)x.size()
  4. using namespace std;
  5.  
  6. const int MAXP = (1ll << 12) + 5;
  7. int p, r;
  8. int n, m;
  9.  
  10. int x[MAXP], y[MAXP];
  11. int grid[MAXP][MAXP], sum[MAXP][MAXP];
  12. map<int, int> cx, cy;
  13. vector<int> xs, ys;
  14.  
  15. void compress() {
  16.   for (int i = 1; i <= p; i++) {
  17.     cin >> x[i] >> y[i];
  18.     xs.push_back(x[i]);
  19.     ys.push_back(y[i]);
  20.   }
  21.   sort(xs.begin(), xs.end()); xs.erase(unique(xs.begin(), xs.end()), xs.end());
  22.   sort(ys.begin(), ys.end()); ys.erase(unique(ys.begin(), ys.end()), ys.end());
  23.   int xptr = 1;
  24.   for (ll i : xs) {
  25.     cx[i] = xptr;
  26.     ++xptr;
  27.   }
  28.   int yptr = 1;
  29.   for (ll i : ys) {
  30.     cy[i] = yptr;
  31.     ++yptr;
  32.   }
  33.   n = yptr, m = xptr;
  34. }
  35.  
  36. int calculate(int x2, int y2, int x1, int y1) {
  37.   return sum[y2][x2] - sum[y2][x1 - 1] - sum[y1 - 1][x2] + sum[y1 - 1][x1 - 1];
  38. }
  39.  
  40. int find_upper(int w, vector<int> &c) {
  41.   int low = 0, high = sz(c), ans = sz(c);
  42.   while (low <= high) {
  43.     int mid = (low + high) / 2;
  44.     if (c[mid] > w) {
  45.       high = mid - 1, ans = mid;
  46.     } else {
  47.       low = mid + 1;
  48.     }
  49.   }
  50.   --ans;
  51.   return ans + 1;
  52. }
  53.  
  54. int find_lower(int w, vector<int> &c) {
  55.   int low = 0, high = sz(c), ans = sz(c);
  56.   while (low <= high) {
  57.     int mid = (low + high) / 2;
  58.     if (c[mid] >= w) {
  59.       high = mid - 1, ans = mid;
  60.     } else {
  61.       low = mid + 1;
  62.     }
  63.   }
  64.   return ans + 1;
  65. }
  66.  
  67. void solve() {
  68.   cin >> p >> r;
  69.   compress();
  70.   for (int i = 1; i <= p; i++) {
  71.     ++grid[cy[y[i]]][cx[x[i]]];
  72.   }
  73.   for (int i = 1; i <= n; i++) {
  74.     for (int j = 1; j <= m; j++) {
  75.       sum[i][j] = sum[i][j - 1] + grid[i][j];
  76.     }
  77.   }
  78.   for (int j = 1; j <= m; j++) {
  79.     for (int i = 1; i <= n; i++) {
  80.       sum[i][j] += sum[i - 1][j];
  81.     }
  82.   }
  83.   for (int i = 1; i <= r; i++) {
  84.     int x1, y1, x2, y2;
  85.     cin >> x1 >> y1 >> x2 >> y2;
  86.     if (make_pair(x1, y1) > make_pair(x2, y2)) {
  87.       swap(x1, x2);
  88.       swap(y1, y2);
  89.     }
  90.     if (y1 <= y2) {
  91.       // take upper_bound - 1 on x2, y2
  92.       // take lower_bound on x1, y1
  93.       int nx2 = find_upper(x2, xs);
  94.       int ny2 = find_upper(y2, ys);  
  95.       int nx1 = find_lower(x1, xs);
  96.       int ny1 = find_lower(y1, ys);
  97.       cout << calculate(nx2, ny2, nx1, ny1) << '\n';
  98.     } else {
  99.       int nx2 = find_upper(x2, xs);
  100.       int ny1 = find_upper(y1, ys);
  101.       int nx1 = find_lower(x1, xs);
  102.       int ny2 = find_lower(y2, ys);
  103.       cout << calculate(nx2, ny1, nx1, ny2) << '\n';
  104.     }
  105.   }
  106. }
  107.  
  108. int main() {
  109.   ios_base::sync_with_stdio(false);
  110.   cin.tie(nullptr);
  111.   // freopen("input.txt", "r", stdin);
  112.   // freopen("output.txt", "w", stdout);
  113.   solve();
  114.   return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment