Submission #207696

#TimeUsernameProblemLanguageResultExecution timeMemory
207696nvmdavaExamination (JOI19_examination)C++17
100 / 100
2273 ms558160 KiB
#include <bits/stdc++.h> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define ll long long #define ff first #define ss second #define N 100005 #define MOD 1000000007 #define INF 0x3f3f3f3f vector<pair<int, pair<int, int> > > ar; vector<pair<pair<int, int>, pair<int, int> > > qu; map<int, int> scmp, tcmp; int ss, ts; struct Y { int val = 0; Y *l = NULL, *r = NULL; int query(int L, int R, int y){ if(R <= y) return val; if(L > y) return 0; int m = (L + R) >> 1; int w = 0; if(l) w += l -> query(L, m, y); if(r && m < y) w += r -> query(m + 1, R, y); return w; } void update(int L, int R, int y){ ++val; if(L == R) return; int m = (L + R) >> 1; if(m >= y){ if(!l) l = new Y(); l -> update(L, m, y); } else { if(!r) r = new Y(); r -> update(m + 1, R, y); } } }; struct X { Y *val = new Y(); X *l = NULL, *r = NULL; int query(int L, int R, int x, int y){ if(R <= x) return val -> query(1, ts, y); if(L > x) return 0; int m = (L + R) >> 1; int w = 0; if(l) w += l -> query(L, m, x, y); if(r && m < x) w += r -> query(m + 1, R, x, y); return w; } void update(int L, int R, int x, int y){ val -> update(1, ts, y); if(L == R) return; int m = (L + R) >> 1; if(m >= x){ if(!l) l = new X(); l -> update(L, m, x, y); } else { if(!r) r = new X(); r -> update(m + 1, R, x, y); } } } *seg = new X(); int ans[N]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin>>n>>q; int mxs = 0, mxt = 0; for(int i = 1; i <= n; ++i){ int s, t; cin>>s>>t; mxs = max(mxs, s); mxt = max(mxt, t); ar.push_back({s + t, {s, t}}); scmp[s] = 0; tcmp[t] = 0; } int w; w = 0; for(auto& x : scmp) x.ss = ++w; w = 0; for(auto& x : tcmp) x.ss = ++w; ss = scmp.size(); ts = tcmp.size(); for(auto& x : ar){ x.ss.ff = ss + 1 - scmp[x.ss.ff]; x.ss.ss = ts + 1 - tcmp[x.ss.ss]; } sort(ar.rbegin(), ar.rend()); for(int i = 1; i <= q; ++i){ int a, b, c; cin>>a>>b>>c; if(a > mxs || b > mxt) continue; a = scmp.lower_bound(a) -> ss; b = tcmp.lower_bound(b) -> ss; a = ss + 1 - a; b = ts + 1 - b; qu.push_back({{c, i}, {a, b}}); } sort(qu.rbegin(), qu.rend()); w = 0; for(auto& x : qu){ while(w != n && ar[w].ff >= x.ff.ff){ seg -> update(1, ss, ar[w].ss.ff, ar[w].ss.ss); ++w; } ans[x.ff.ss] = seg -> query(1, ss, x.ss.ff, x.ss.ss); } for(int i = 1; i <= q; ++i) cout<<ans[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...