Submission #328925

#TimeUsernameProblemLanguageResultExecution timeMemory
328925dolphingarlicExamination (JOI19_examination)C++14
2 / 100
3068 ms14896 KiB
#include <bits/stdc++.h> #pragma GCC optimize("unroll-loops") #pragma GCC optimize("O3") #pragma GCC target("sse4,avx2,fma,avx") typedef long long ll; using namespace std; const int B = 750; int n, q; ll s[100001], t[100001], sums[100001], sum_ptr[100001]; pair<ll, int> by_s[100001], by_t[100001]; tuple<ll, ll, ll, int> queries[100001]; int bit[100001]; int ans[100001]; void update(int pos, int val) { for (; pos <= n; pos += pos & -pos) bit[pos] += val; } int query(int l, int r) { int ans = 0; for (; r; r -= r & -r) ans += bit[r]; for (l--; l; l -= l & -l) ans -= bit[l]; return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> q; for (int i = 0; i < n; i++) { cin >> s[i] >> t[i]; sums[i] = s[i] + t[i]; by_s[i] = {s[i], i}; by_t[i] = {t[i], i}; } sort(sums, sums + n); for (int i = 0; i < n; i++) { sum_ptr[i] = lower_bound(sums, sums + n, s[i] + t[i]) - sums + 1; } sort(by_s, by_s + n); sort(by_t, by_t + n); for (int i = 0; i < q; i++) { ll a, b, c; cin >> a >> b >> c; c = lower_bound(sums, sums + n, c) - sums + 1; queries[i] = {a, b, c, i}; } sort(queries, queries + q, greater<tuple<ll, ll, ll, int>>()); unordered_map<int, int> good_cnt; for (int i = 0, sptr = n, tptr = n; i < q; i += B) { sort(queries + i, queries + min(q, i + B), [](tuple<ll, ll, ll, int> A, tuple<ll, ll, ll, int> B) { return get<1>(A) > get<1>(B); }); for (int j = i; j < min(q, i + B); j++) { ll a, b, c, idx; tie(a, b, c, idx) = queries[j]; while (sptr && by_s[sptr - 1].first >= a) { good_cnt[by_s[sptr - 1].second]++; if (good_cnt[by_s[sptr - 1].second] == 2) { update(sum_ptr[by_s[sptr - 1].second], 1); } sptr--; } while (sptr != n && by_s[sptr].first < a) { good_cnt[by_s[sptr].second]--; if (good_cnt[by_s[sptr].second] == 1) { update(sum_ptr[by_s[sptr].second], -1); } sptr++; } while (tptr && by_t[tptr - 1].first >= b) { good_cnt[by_t[tptr - 1].second]++; if (good_cnt[by_t[tptr - 1].second] == 2) { update(sum_ptr[by_t[tptr - 1].second], 1); } tptr--; } while (tptr != n && by_t[tptr].first < b) { good_cnt[by_t[tptr].second]--; if (good_cnt[by_t[tptr].second] == 1) { update(sum_ptr[by_t[tptr].second], -1); } tptr++; } ans[idx] = query(c, n); } } for (int i = 0; i < q; i++) cout << ans[i] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...