#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll MAXN = 3e5+5; ll n,q,w,t,s,k,r,last,cnt; map<ll,ll> a; int main(){ scanf("%lld", &n); for(int i = 0; i < n; i++){ scanf("%lld", &w); a[w]++; } scanf("%lld", &q); while(q--){ scanf("%lld", &t); if(t == 1){ scanf("%lld%lld", &s, &k); r = 0,last = -1,cnt = 0; map<ll,ll> wziete; while(s < k){ auto x = a.lower_bound(s); if(x == a.begin()) break; x = prev(x); while(wziete[(*x).first] == (*x).second){ if(x == a.begin()) break; x = prev(x); } if((*x).first >= s || wziete[(*x).first] == (*x).second) break; s += (*x).first; wziete[(*x).first]++; r++; } if(s < k) printf("-1\n"); else printf("%lld\n", r); }else if(t == 2){ scanf("%lld", &w); a[w]++; }else{ scanf("%lld", &w); if(a.count(w) == 1) a.erase(w); else a[w]--; } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll MAXN = 3e5+5; ll n,q,w,t,s,k,r,last,cnt; map<ll,ll> a; int main(){ scanf("%lld", &n); for(int i = 0; i < n; i++){ scanf("%lld", &w); a[w]++; } scanf("%lld", &q); while(q--){ scanf("%lld", &t); if(t == 1){ scanf("%lld%lld", &s, &k); r = 0,last = -1,cnt = 0; map<ll,ll> wziete; while(s < k){ auto x = a.lower_bound(s); if(x == a.begin()) break; x = prev(x); while(wziete[(*x).first] == (*x).second){ if(x == a.begin()) break; x = prev(x); } if((*x).first >= s || wziete[(*x).first] == (*x).second) break; s += (*x).first; wziete[(*x).first]++; r++; } if(s < k) printf("-1\n"); else printf("%lld\n", r); }else if(t == 2){ scanf("%lld", &w); a[w]++; }else{ scanf("%lld", &w); if(a.count(w) == 1) a.erase(w); else a[w]--; } } } |