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
114
115
116
117
118
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <string>

using namespace std;
typedef long long int llint;

/*

4
1 4 8 1
15
1 2 3
1 2 4
1 2 5
1 3 3
1 3 5
1 3 16
1 4 16
1 8 17
1 100 101
1 100 115
1 3 9
2 2
1 3 9
3 4
1 3 9


==

1
2
-1
0
2
4
3
2
1
-1
3
2
-1


*/

map<llint,int> m;
llint t[400000];

void add(llint w)
{
	auto it=m.find(w);
	if(it!=m.end())++it->second;
	else m[w]=1;
}

void remove(llint w)
{
	auto it=m.find(w);
	if(--it->second==0)m.erase(it);
}

int solve(llint a,llint b)
{
	llint curr=a;
	int ts=0;
	while (curr<b)
	{
		if(m.empty())break;
		auto it=m.lower_bound(curr);
		if(it==m.begin())break;
		--it;
		t[ts++]=it->first;
		curr+=it->first;
		remove(it->first);
	}
	for(int i=0;i<ts;++i)add(t[i]);
	return curr>=b?ts:-1;
}

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;++i)
	{
		llint w;
		scanf("%lld",&w);
		add(w);
	}
	int ops;
	scanf("%d",&ops);
	for(int i=0;i<ops;++i)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			llint a,b;
			scanf("%lld %lld",&a,&b);
			printf("%d\n",solve(a,b));
		}
		else
		{
			llint w;
			scanf("%lld",&w);
			if(op==2)add(w);
			else remove(w);
		}
	}
	
	return 0;
}