Submission #1179994

#TimeUsernameProblemLanguageResultExecution timeMemory
1179994Hamed_GhaffariExamination (JOI19_examination)C++20
100 / 100
294 ms21916 KiB
#include<bits/stdc++.h> using namespace std; using pii = pair<int, int>; #define pb push_back #define all(x) x.begin(), x.end() #define SZ(x) int(x.size()) const int MXN = 1e5+2; struct Fen { int n; vector<int> cmp, fen; inline void add(int x) { cmp.pb(x); } inline void build() { sort(all(cmp)); cmp.resize(unique(all(cmp))-cmp.begin()); n = SZ(cmp); fen.resize(n+1, 0); } inline void upd(int p, int x) { for(p=lower_bound(all(cmp), p)-cmp.begin()+1; p<=n; p+=p&-p) fen[p] += x; } inline int get(int p) { int res=0; for(p=upper_bound(all(cmp), p)-cmp.begin(); p; p-=p&-p) res += fen[p]; return res; } }; struct Fen_2D { int n; vector<int> cmp; vector<Fen> fen; inline void add1(int x) { cmp.pb(x); } inline void build1() { sort(all(cmp)); cmp.resize(unique(all(cmp))-cmp.begin()); n = SZ(cmp); fen.resize(n+1); } inline void add2(int x, int y) { for(x=lower_bound(all(cmp),x)-cmp.begin()+1; x<=n; x+=x&-x) fen[x].add(y); } inline void build2() { for(int i=1; i<=n; i++) fen[i].build(); } inline void upd(int x, int y, int z) { for(x=lower_bound(all(cmp),x)-cmp.begin()+1; x<=n; x+=x&-x) fen[x].upd(y, z); } inline int get(int x, int y) { int res=0; for(x=upper_bound(all(cmp),x)-cmp.begin(); x; x-=x&-x) res += fen[x].get(y); return res; } } ds; int n, q, S[MXN], T[MXN], X[MXN], Y[MXN], Z[MXN], U[MXN], G[MXN], ans[MXN]; int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> q; for(int i=1; i<=n; i++) { cin >> S[i] >> T[i]; ds.add1(-S[i]); } ds.build1(); for(int i=1; i<=n; i++) ds.add2(-S[i], -T[i]); ds.build2(); for(int i=1; i<=q; i++) cin >> X[i] >> Y[i] >> Z[i]; iota(U+1, U+n+1, 1); sort(U+1, U+n+1, [&](int i, int j) { return S[i]+T[i] > S[j]+T[j]; }); iota(G+1, G+q+1, 1); sort(G+1, G+q+1, [&](int i, int j) { return Z[i] > Z[j]; }); int ptr=1; for(int i=1; i<=q; i++) { while(ptr<=n && S[U[ptr]]+T[U[ptr]]>=Z[G[i]]) { ds.upd(-S[U[ptr]], -T[U[ptr]], 1); ptr++; } ans[G[i]] = ds.get(-X[G[i]], -Y[G[i]]); } 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...