제출 #1343697

#제출 시각아이디문제언어결과실행 시간메모리
1343697ayazExamination (JOI19_examination)C++20
20 / 100
231 ms34128 KiB
#pragma GCC optimize("O3")

#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "algos/debug.h"
#else
#define debug(...) 42;
#endif

#define all(x) (x).begin(), (x).end()
#define isz(x) (int)x.size()
// #define int long long

const int sz = 2e5 + 1, inf = 1e9, mod = 1e9 + 7;
struct MergeSortTree {
  vector<vector<array<int, 2>>> st;
  vector<array<int, 2>> a;
  MergeSortTree(int n, vector<int> r, vector<int> s) {
    st.resize(n * 4 + 1);
    a.resize(n + 1);
    for (int i = 1; i <= n; i++) {
      a[i] = {r[i], s[i]};
    }
  }
  void build(int l, int r, int v) {
    if (l == r) {
      st[v].push_back({a[l][0], a[l][1]});
      return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, v << 1);
    build(mid + 1, r, v << 1 | 1);
    merge(all(st[v << 1]), all(st[v << 1 | 1]), back_inserter(st[v]));
  }
  int getans_r(int ql, int qr, int l, int r, int val, int v) {
    if (ql > r || l > qr)
      return 0;
    if (ql <= l && r <= qr) {
      auto it = lower_bound(all(st[v]), array<int, 2>{val, -inf});
      return st[v].end() - it;
    }
    int mid = (l + r) >> 1;
    return getans_r(ql, qr, l, mid, val, v << 1) +
           getans_r(ql, qr, mid + 1, r, val, v << 1 | 1);
  }
  int getans_s(int ql, int qr, int l, int r, int val, int v) {
    if (ql > r || l > qr)
      return 0;
    if (ql <= l && r <= qr) {
      auto it =
          lower_bound(all(st[v]), array<int, 2>{-inf, val},
                      [](const array<int, 2> &aa, const array<int, 2> &bb) {
                        return aa[1] < bb[1];
                      });
      return st[v].end() - it;
    }
    int mid = (l + r) >> 1;
    return getans_s(ql, qr, l, mid, val, v << 1) +
           getans_s(ql, qr, mid + 1, r, val, v << 1 | 1);
  }
};
void run(int tc) {
  int n, q;
  cin >> n >> q;
  vector<array<int, 2>> a(n + 1);
  vector<int> l(n + 1), r(n + 1), s(n + 1);
  for (int i = 1; i <= n; i++) {
    cin >> a[i][0] >> a[i][1];
  }
  sort(all(a));
  for (int i = 1; i <= n; i++) {
    l[i] = a[i][0];
    r[i] = a[i][1];
    s[i] = l[i] + r[i];
  }
  MergeSortTree t1(n + 1, r, s);
  t1.build(1, n, 1);
  while (q--) {
    int x, y, z;
    cin >> x >> y >> z;
    auto it = lower_bound(l.begin() + 1, l.end(), x);
    if (it == l.end()) {
      cout << 0 << '\n';
      continue;
    }
    auto jt = n - t1.getans_r(it - l.begin(), n, 1, n, y, 1) + 1;
    if (jt == n + 1) {
      cout << 0 << '\n';
      continue;
    }
    int ans = t1.getans_s(jt, n, 1, n, z, 1);
    cout << ans << '\n';
  }
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t = 1;
  // cin >> t;
  for (int tc = 1; tc <= t; tc++)
    run(tc);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...