#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
map<LL, int> map;
map.clear();
int n;
cin >> n;
LL sum = 0;
for (int i = 0; i < n; i++) {
LL val;
cin >> val;
map[val]++;
sum += val;
}
int q;
cin >> q;
for (int i = 0; i < q; i++) {
int a;
cin >> a;
if (a == 1) {
LL weight, c;
cin >> weight >> c;
LL goal = c - weight;
//cout << "SUMA: " << goal << " " << sum << endl;
if (goal > sum) {
cout << -1 << '\n';
continue;
}
vector <pair<LL, int>> vec;
int zlicz = 0;
bool succ = 1;
int j = 0;
while (1) {
if (goal <= 0)
break;
auto it = map.lower_bound(weight);
//cout << "ZNALEZIONE" << it->first << " "<< it->second << endl;
//cout << "WAGA" << weight << endl;
if (it == map.begin() && it->first >= weight) {
//cout << "dupa";
succ = 0;
break;
}
if ((it != map.begin() && it->first >= weight) || it == map.end())
--it;
//cout << "ZJADANIE " << it->first << " " << it->second << endl;
auto fsize = it->first;
auto fcount = it->second;
vec.push_back(make_pair(fsize, fcount));
zlicz++;
weight += fsize;
goal -= fsize;
//cout << fsize << endl;
//cout << map[fsize] << endl;
if (fcount > 1)
map[fsize]--;
else
map.erase(fsize);
//cout << map[fsize] << endl;
}
if (succ)
cout << zlicz << '\n';
else
cout << -1 << '\n';
for (int i = vec.size() -1; i>= 0; i--)
map[vec[i].first] = vec[i].second;
}
else if(a == 2) {
LL b;
cin >> b;
sum += b;
map[b]++;
}
else {
LL b;
cin >> b;
sum -= b;
if (map[b] > 1)
map[b]--;
else
map.erase(b);
}
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); map<LL, int> map; map.clear(); int n; cin >> n; LL sum = 0; for (int i = 0; i < n; i++) { LL val; cin >> val; map[val]++; sum += val; } int q; cin >> q; for (int i = 0; i < q; i++) { int a; cin >> a; if (a == 1) { LL weight, c; cin >> weight >> c; LL goal = c - weight; //cout << "SUMA: " << goal << " " << sum << endl; if (goal > sum) { cout << -1 << '\n'; continue; } vector <pair<LL, int>> vec; int zlicz = 0; bool succ = 1; int j = 0; while (1) { if (goal <= 0) break; auto it = map.lower_bound(weight); //cout << "ZNALEZIONE" << it->first << " "<< it->second << endl; //cout << "WAGA" << weight << endl; if (it == map.begin() && it->first >= weight) { //cout << "dupa"; succ = 0; break; } if ((it != map.begin() && it->first >= weight) || it == map.end()) --it; //cout << "ZJADANIE " << it->first << " " << it->second << endl; auto fsize = it->first; auto fcount = it->second; vec.push_back(make_pair(fsize, fcount)); zlicz++; weight += fsize; goal -= fsize; //cout << fsize << endl; //cout << map[fsize] << endl; if (fcount > 1) map[fsize]--; else map.erase(fsize); //cout << map[fsize] << endl; } if (succ) cout << zlicz << '\n'; else cout << -1 << '\n'; for (int i = vec.size() -1; i>= 0; i--) map[vec[i].first] = vec[i].second; } else if(a == 2) { LL b; cin >> b; sum += b; map[b]++; } else { LL b; cin >> b; sum -= b; if (map[b] > 1) map[b]--; else map.erase(b); } } return 0; } |
English