#include <iostream> #include <bits/stdc++.h> using namespace std; vector<long long> ryby; long long n,q,o,s,wynik,ocz,ind; long long w; map<long long, int> mapa; vector<long long> zjedzone; int szukaj(long long a) { int p=0; int k=ryby.size()-1; int r=k; int sr; while(p<=k) { sr=(p+k)/2; if(ryby[sr]>=a) {k=sr; if(sr==0) return -1; } else { if(sr==k) return k; if(ryby[sr+1]>=a) return sr; p=sr+1; } } return -1; } int zmniejsz(int ind) { if(mapa[ryby[ind]]==0) { while(mapa[ryby[ind]]==0&&ind>=0) { ind--; } } return ind; } long long atak(long long s, long long ocz) { wynik=0; while(s<ocz) { ind=szukaj(s); ind=zmniejsz(ind); if(ind<0) return -1; s+=ryby[ind]; mapa[ryby[ind]]--; wynik++; zjedzone.push_back(ryby[ind]); } return wynik; } void zwrot() { for(int i=zjedzone.size()-1; i>=0; --i) { mapa[zjedzone[i]]++; zjedzone.pop_back(); } } int main() { ios_base::sync_with_stdio(0); cin>>n; for(int i=0; i<n; ++i) { cin>>w; if(mapa[w]==0)ryby.push_back(w); mapa[w]++; } cin>>q; sort(ryby.begin(), ryby.end() ); for(int i=0; i<q; ++i) { cin>>o; if(o==1) { cin>>s>>ocz; cout<<atak(s,ocz)<<endl; zwrot(); } if(o==2) { cin>>w; if(mapa[w]>0) mapa[w]++; else { mapa[w]++; ryby.push_back(w); sort(ryby.begin(), ryby.end()); } } if(o==3) { cin>>w; mapa[w]--; } } return 0; }
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <iostream> #include <bits/stdc++.h> using namespace std; vector<long long> ryby; long long n,q,o,s,wynik,ocz,ind; long long w; map<long long, int> mapa; vector<long long> zjedzone; int szukaj(long long a) { int p=0; int k=ryby.size()-1; int r=k; int sr; while(p<=k) { sr=(p+k)/2; if(ryby[sr]>=a) {k=sr; if(sr==0) return -1; } else { if(sr==k) return k; if(ryby[sr+1]>=a) return sr; p=sr+1; } } return -1; } int zmniejsz(int ind) { if(mapa[ryby[ind]]==0) { while(mapa[ryby[ind]]==0&&ind>=0) { ind--; } } return ind; } long long atak(long long s, long long ocz) { wynik=0; while(s<ocz) { ind=szukaj(s); ind=zmniejsz(ind); if(ind<0) return -1; s+=ryby[ind]; mapa[ryby[ind]]--; wynik++; zjedzone.push_back(ryby[ind]); } return wynik; } void zwrot() { for(int i=zjedzone.size()-1; i>=0; --i) { mapa[zjedzone[i]]++; zjedzone.pop_back(); } } int main() { ios_base::sync_with_stdio(0); cin>>n; for(int i=0; i<n; ++i) { cin>>w; if(mapa[w]==0)ryby.push_back(w); mapa[w]++; } cin>>q; sort(ryby.begin(), ryby.end() ); for(int i=0; i<q; ++i) { cin>>o; if(o==1) { cin>>s>>ocz; cout<<atak(s,ocz)<<endl; zwrot(); } if(o==2) { cin>>w; if(mapa[w]>0) mapa[w]++; else { mapa[w]++; ryby.push_back(w); sort(ryby.begin(), ryby.end()); } } if(o==3) { cin>>w; mapa[w]--; } } return 0; } |