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
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

#define ll long long

using namespace std;

//lower_bound - pierwszy >= szukanemu
//upper_bound - pierwszy wiekszy

const ll INF=1e18;
ll n, q, type, waga;
multiset<ll> staw;

void atakSzczupaka()
{
	ll curr, last, res=0;
	cin >> curr >> last;
	vector<ll> veq;
	
	bool pos=1;
	
	while(curr < last)
	{
		//ll szprot = *(upper_bound(staw.begin(), staw.end(), -curr));
		ll szprot = *(staw.upper_bound(-curr));
		
		if(szprot==INF)
		{
			pos=0;
			break;
		}
		
		curr -= szprot;
		veq.push_back(szprot);
		staw.erase(staw.find(szprot));
		res++;
	}
	
	for(int i=0; i<veq.size(); i++)
			staw.insert(veq[i]);
	
	if(pos)
	{
		cout << res << '\n'; 
		return;
	}
	cout << -1 << "\n";
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	while(n--)
	{
		ll temp;
		cin >> temp;
		staw.insert(-temp);
	}
	staw.insert(INF);
	
	cin >> q;
	while(q--)
	{
		cin >> type;
		if(type==1)
		{
			atakSzczupaka();	
		}
		else if(type==2)
		{
			cin >> waga;
			staw.insert(-waga);
		}
		else
		{
			cin >> waga;
			staw.erase(staw.find(-waga));
		}
	}
	
	/*for(auto it=veq.begin(); it!=veq.end(); it++)
		cout << *it << ' ';
	cout << '\n';
	
	cout << *(upper_bound(veq.begin(), veq.end(), 0)) << '\n';*/
}