Submission #1173583

#TimeUsernameProblemLanguageResultExecution timeMemory
1173583avighnaExamination (JOI19_examination)C++20
0 / 100
3095 ms3260 KiB
#include <bits/stdc++.h>

// struct SegmentTree {
// public:
//   std::vector<int> seg;
//   int n;

//   SegmentTree(int n) : n(n) { seg.resize(2 * n); }

//   void add(int idx, int del) {
//     for (seg[idx += n] += del; idx > 1; idx /= 2) {
//       seg[idx / 2] = seg[idx] + seg[idx ^ 1];
//     }
//   }

//   int query(int l, int r) {
//     int ans = 0;
//     for (l += n, r += n + 1; l < r; l /= 2, r /= 2) {
//       if (l & 1) {
//         ans += seg[l++];
//       }
//       if (r & 1) {
//         ans += seg[--r];
//       }
//     }
//     return ans;
//   }
// };

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n, q;
  std::cin >> n >> q;
  std::vector<std::pair<int, int>> a(n);
  int min_a = 1e9, max_a = 0, min_b = 1e9, max_b = 0;
  for (auto &[s, t] : a) {
    std::cin >> s >> t;
    min_a = std::min(min_a, s);
    max_a = std::max(max_a, s);
    min_b = std::min(min_b, t);
    max_b = std::max(max_b, t);
  }
  std::sort(a.begin(), a.end(),
            [&](std::pair<int, int> p1, std::pair<int, int> p2) {
              return p1.first + p1.second < p2.first + p2.second;
            });
  struct Query {
    int x, y, z;
    int i;
  };
  std::vector<Query> queries;
  for (int i = 0, x, y, z; i < q; ++i) {
    std::cin >> x >> y >> z;
    queries.push_back({x, y, z, i});
  }

  std::vector<int> ans(q);

  auto dnc = [&](auto &&self, std::vector<std::pair<int, int>>::iterator beg,
                 std::vector<std::pair<int, int>>::iterator end,
                 std::vector<Query>::iterator q_beg,
                 std::vector<Query>::iterator q_end, int s_a, int e_a, int s_b,
                 int e_b, int del) {
    if (q_beg >= q_end) {
      return;
    }
    if (s_a == e_a and s_b == e_b) {
      for (auto it = q_beg; it != q_end; ++it) {
        // int v = beg - a.begin();
        // int low = beg - a.begin(), high = end - a.begin();
        // while (low <= high) {
        //   int mid = (low + high) / 2;
        //   if (a[mid].first + a[mid].second >= it->z) {
        //     v = mid;
        //     high = mid - 1;
        //   } else {
        //     low = mid + 1;
        //   }
        // }
        // if (a[v].first + a[v].second >= it->z) {
        //   ans[it->i] = end - a.begin() - v + del;
        // }
        ans[it->i] = end - beg + del;
      }
      return;
    }
    if (s_a < e_a) {
      int m_a = (s_a + e_a) / 2;
      auto pred1 = [&](std::pair<int, int> p) { return p.first <= m_a; };
      auto pred2 = [&](Query q) { return q.x <= m_a; };
      std::partition(a.begin(), a.end(), pred1);
      std::partition(queries.begin(), queries.end(), pred2);
      auto a_m = std::partition_point(a.begin(), a.end(), pred1);
      auto q_m = std::partition_point(queries.begin(), queries.end(), pred2);
      self(self, beg, a_m, q_beg, q_m, s_a, m_a, s_b, e_b, del + end - a_m);
      self(self, a_m, end, q_m, q_end, m_a + 1, e_a, s_b, e_b, del);
      return;
    } else {
      int m_b = (s_b + e_b) / 2;
      auto pred1 = [&](std::pair<int, int> p) { return p.second <= m_b; };
      auto pred2 = [&](Query q) { return q.y <= m_b; };
      std::partition(a.begin(), a.end(), pred1);
      std::partition(queries.begin(), queries.end(), pred2);
      auto a_m = std::partition_point(a.begin(), a.end(), pred1);
      auto q_m = std::partition_point(queries.begin(), queries.end(), pred2);
      self(self, beg, a_m, q_beg, q_m, s_a, e_a, s_b, m_b, del + end - a_m);
      self(self, a_m, end, q_m, q_end, s_a, e_a, m_b + 1, e_b, del);
    }
  };
  dnc(dnc, a.begin(), a.end(), queries.begin(), queries.end(), min_a, max_a,
      min_b, max_b, 0);

  for (auto &i : ans) {
    std::cout << i << '\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...