Submission #557097

#TimeUsernameProblemLanguageResultExecution timeMemory
557097JomnoiExamination (JOI19_examination)C++17
100 / 100
221 ms13364 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5 + 10; const int MAX_Q = 1e5 + 10; int S[MAX_N], T[MAX_N]; int X[MAX_Q], Y[MAX_Q], Z[MAX_Q], ans[MAX_Q]; vector <int> A, B, C; vector <int> update, query; class FenwickTree { private : int N; vector <int> tree; public : FenwickTree() {} FenwickTree(int n) : N(n), tree(N + 1, 0) {} void add(int x, int v) { for(int i = x; i <= N; i += (i & -i)) { tree[i] += v; } } int get(int x) { int res = 0; for(int i = x; i >= 1; i -= (i & -i)) { res += tree[i]; } return res; } }; int getIndex(vector <int> &a, int x) { return lower_bound(a.begin(), a.end(), x) - a.begin() + 1; } int main() { cin.tie(nullptr)->sync_with_stdio(false); int N, Q; cin >> N >> Q; for(int i = 1; i <= N; i++) { cin >> S[i] >> T[i]; A.push_back(S[i]); B.push_back(T[i]); C.push_back(S[i] + T[i]); } for(int i = 1; i <= Q; i++) { cin >> X[i] >> Y[i] >> Z[i]; A.push_back(X[i]); B.push_back(Y[i]); C.push_back(S[i] + T[i]); } sort(A.begin(), A.end()); sort(B.begin(), B.end()); sort(C.begin(), C.end()); A.resize(unique(A.begin(), A.end()) - A.begin()); B.resize(unique(B.begin(), B.end()) - B.begin()); C.resize(unique(C.begin(), C.end()) - C.begin()); int j; FenwickTree fwA, fwB; update.resize(N); iota(update.begin(), update.end(), 1); // X + Y >= Z fwB = FenwickTree(B.size()); query.clear(); for(int i = 1; i <= Q; i++) { if(X[i] + Y[i] >= Z[i]) { query.push_back(i); } } sort(update.begin(), update.end(), [&](const int &a, const int &b) { return S[a] > S[b]; }); sort(query.begin(), query.end(), [&](const int &a, const int &b) { return X[a] > X[b]; }); j = 0; for(auto i : query) { while(j < N and S[update[j]] >= X[i]) { fwB.add(getIndex(B, T[update[j]]), 1); j++; } ans[i] = j - fwB.get(getIndex(B, Y[i]) - 1); } // X + Y < Z fwA = FenwickTree(A.size()); fwB = FenwickTree(B.size()); query.clear(); for(int i = 1; i <= Q; i++) { if(X[i] + Y[i] < Z[i]) { query.push_back(i); } } sort(update.begin(), update.end(), [&](const int &a, const int &b) { return S[a] + T[a] > S[b] + T[b]; }); sort(query.begin(), query.end(), [&](const int &a, const int &b) { return Z[a] > Z[b]; }); j = 0; for(auto i : query) { while(j < N and S[update[j]] + T[update[j]] >= Z[i]) { fwA.add(getIndex(A, S[update[j]]), 1); fwB.add(getIndex(B, T[update[j]]), 1); j++; } ans[i] += j - fwA.get(getIndex(A, X[i]) - 1) - fwB.get(getIndex(B, Y[i]) - 1); } for(int i = 1; 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...