Submission #205172

#TimeUsernameProblemLanguageResultExecution timeMemory
205172egekabasExamination (JOI19_examination)C++14
100 / 100
1045 ms71696 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<ull, ull> pull; typedef pair<int, int> pii; typedef pair<ld, ld> pld; struct query{ ll x, y, z, id; }; struct st{ ll a, b, id; }; query qs[100009]; ll n, q; st sa[100009]; st sb[100009]; ll idplace[100009]; ll sortbya(st x, st y){return x.a < y.a;} ll sortbyb(st x, st y){return x.b < y.b;} vector<ll> compress; ll getid(ll x){return lower_bound(compress.begin(), compress.end(), x)-compress.begin();} vector<ll> seg[400009]; vector<ll> bit[400009]; ll build(ll v, ll tl, ll tr){ seg[v].pb(-1); if(tl == tr) seg[v].pb(getid(sb[tl].a+sb[tl].b)); else{ ll tm = (tl+tr)/2; build(2*v, tl, tm); build(2*v+1, tm+1, tr); seg[v].resize(seg[2*v].size()+seg[2*v+1].size()-1); merge(seg[2*v].begin()+1, seg[2*v].end(), seg[2*v+1].begin()+1, seg[2*v+1].end(), seg[v].begin()+1); //cout << seg[2*v].size() << ' ' << seg[2*v+1].size() << ' ' << seg[v].size() << '\n'; } bit[v].resize(seg[v].size()); } ll getbit(ll id, vector<ll> &v){ ll ret = 0; for(;id < v.size(); id += id&(-id)) ret += v[id]; return ret; } ll updbit(ll id, ll val, vector<ll> &v){ for(;id > 0; id -= id&(-id)) v[id] += val; } void upd(ll v, ll tl, ll tr, ll id, ll val){ ll place = lower_bound(seg[v].begin(), seg[v].end(), val)-seg[v].begin(); updbit(place, 1, bit[v]); if(tl != tr){ ll tm = (tl+tr)/2; if(id <= tm) upd(2*v, tl, tm, id, val); else upd(2*v+1, tm+1, tr, id, val); } } ll get(ll v, ll tl, ll tr, ll l, ll r, ll val){ if(tr < l || r < tl || l > r) return 0; if(l <= tl && tr <= r){ ll place = lower_bound(seg[v].begin(), seg[v].end(), val)-seg[v].begin(); return getbit(place, bit[v]); } else{ ll tm = (tl+tr)/2; return get(2*v, tl, tm, l, r, val)+get(2*v+1, tm+1, tr, l, r, val); } } ll ans[100009]; ll sortquery(query a, query b){return a.x > b.x;} int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); cin >> n >> q; for(ll i = 0; i < n; ++i){ cin >> sa[i].a >> sa[i].b; compress.pb(sa[i].a+sa[i].b); sa[i].id = i; sb[i] = sa[i]; } sort(sa, sa+n, sortbya); sort(sb, sb+n, sortbyb); for(ll i = 0; i < n; ++i) idplace[sb[i].id] = i; for(ll i = 0; i < q; ++i){ cin >> qs[i].x >> qs[i].y >> qs[i].z; compress.pb(qs[i].z); qs[i].id = i; } sort(qs, qs+n, sortquery); sort(compress.begin(), compress.end()); compress.resize(unique(compress.begin(), compress.end())-compress.begin()); build(1, 0, n-1); ll cura = n-1; for(ll i = 0; i < q; ++i){ while(cura >= 0 && sa[cura].a >= qs[i].x){ upd(1, 0, n-1, idplace[sa[cura].id], getid(sa[cura].a+sa[cura].b)); --cura; } ll l = 0, r = n; while(l < r){ ll mid = (l+r)/2; if(sb[mid].b >= qs[i].y) r = mid; else l = mid+1; } ans[qs[i].id] = get(1, 0, n-1, l, n-1, getid(qs[i].z)); } for(ll i = 0; i < q; ++i) cout << ans[i] << '\n'; }

Compilation message (stderr)

examination.cpp: In function 'll build(ll, ll, ll)':
examination.cpp:44:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
examination.cpp: In function 'll getbit(ll, std::vector<long long int>&)':
examination.cpp:47:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(;id < v.size(); id += id&(-id))
          ~~~^~~~~~~~~~
examination.cpp: In function 'll updbit(ll, ll, std::vector<long long int>&)':
examination.cpp:54:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...