// Artur Kraska, II UWr

#include <bits/stdc++.h>

#define forr(i, n)                  for(int i=0; i<n; i++)
#define FOREACH(iter, coll)         for(auto iter = coll.begin(); iter != coll.end(); ++iter)
#define FOREACHR(iter, coll)        for(auto iter = coll.rbegin(); iter != coll.rend(); ++iter)
#define lbound(P,R,PRED)            ({typeof(P) X=P,RRR=(R), PPP = P; while(PPP<RRR) {X = (PPP+(RRR-PPP)/2); if(PRED) RRR = X; else PPP = X+1;} PPP;})
#define testy()                     int _tests; scanf("%d", &_tests); FOR(_test, 1, _tests)
#define CLEAR(tab)                  memset(tab, 0, sizeof(tab))
#define CONTAIN(el, coll)           (coll.find(el) != coll.end())
#define FOR(i, a, b)                for(int i=a; i<=b; i++)
#define FORD(i, a, b)               for(int i=a; i>=b; i--)
#define MP                          make_pair
#define PB                          push_back
#define deb(X)                      X;

#define M 1000000007
#define INF 1000000000000000007LL

using namespace std;

int n, m, S, teraz;
long long a;
vector <pair<long long, int>> v;

struct pyt
{
    int typ;
    long long a, b;
};
pyt tab[100007];

struct drzewo
{
    long long maks, g_maks;
    long long suma, g_suma;
    int ile, g_ile;
    int kiedy_byl;
};
drzewo d[2200007];

void aktualizuj(int nr)
{
    if(d[nr].kiedy_byl < teraz)
    {
       d[nr].kiedy_byl = teraz;
       d[nr].ile = d[nr].g_ile;
       d[nr].maks = d[nr].g_maks;
       d[nr].suma = d[nr].g_suma;

//       cout << "zaktualizowal " << nr << " na sume " << d[nr].suma << endl;
    }
}

pair<int, long long>  znajdz_maks(long long ile)
{
    int nr = 1;
    long long suma = 0;
    while(nr < S)
    {
        aktualizuj(nr*2);
        if(d[nr*2].maks < ile)
        {
            suma += d[nr*2].suma;
            nr = nr*2+1;
        }
        else
            nr *= 2;
    }
    return MP(nr-S, suma);
}

pair<int, long long>  znajdz_sume(long long ile)
{
    int nr = 1;
    long long suma = 0;
    while(nr < S)
    {
        aktualizuj(nr*2);
        if(suma + d[nr*2].suma <= ile)
        {
            suma += d[nr*2].suma;
            nr = nr*2+1;
        }
        else
            nr *= 2;
    }
    return MP(nr-S, suma);
}

int zlicz_i_zdejmij(int nr, int pocz, int kon, int p, int k)
{
//    cout << " wszedl do " << nr << "z pocz = " << pocz << ", kon = " << kon << ", p = " << p << ", k = " << k << endl;
    int il;
    aktualizuj(nr);
    if(pocz == p && kon == k)
    {
        il = d[nr].ile;
        d[nr].ile = 0;
        d[nr].suma = 0;
        d[nr].maks = 0;
        return il;
    }
    int s = (pocz + kon)>>1;
    if(k <= s)
        il = zlicz_i_zdejmij(nr*2, pocz, s, p, k);
    else if(p > s)
        il = zlicz_i_zdejmij(nr*2+1, s+1, kon, p, k);
    else
        il = zlicz_i_zdejmij(nr*2, pocz, s, p, s)
            + zlicz_i_zdejmij(nr*2+1, s+1, kon, s+1, k);

    aktualizuj(nr*2);
    aktualizuj(nr*2+1);
    d[nr].ile = d[nr*2].ile + d[nr*2+1].ile;
    d[nr].suma = d[nr*2].suma + d[nr*2+1].suma;
    d[nr].maks = max(d[nr*2].maks, d[nr*2+1].maks);

    return il;
}

void dokladaj_g(int nr, long long ile)
{
//    cout << " doklada rybke o masie " << ile << " na pozycji " << nr << endl;
    nr += S;
    d[nr].g_ile = 1;
    d[nr].g_suma = ile;
    d[nr].g_maks = ile;
    nr >>= 1;
    while(nr > 0)
    {
        d[nr].g_ile = d[nr*2].g_ile + d[nr*2+1].g_ile;
        d[nr].g_suma = d[nr*2].g_suma + d[nr*2+1].g_suma;
        d[nr].g_maks = max(d[nr*2].g_maks, d[nr*2+1].g_maks);
        nr >>= 1;
    }
}

void zdejmij_g(int nr)
{
//    cout << " zdejmuje rybke z pozycji " << nr << endl;
    nr += S;
    d[nr].g_ile = 0;
    d[nr].g_suma = 0;
    d[nr].g_maks = 0;
    nr >>= 1;
    while(nr > 0)
    {
        d[nr].g_ile = d[nr*2].g_ile + d[nr*2+1].g_ile;
        d[nr].g_suma = d[nr*2].g_suma + d[nr*2+1].g_suma;
        d[nr].g_maks = max(d[nr*2].g_maks, d[nr*2+1].g_maks);
        nr >>= 1;
    }
}

int main()
{
    scanf("%d", &n);
    forr(i, n)
    {
        scanf("%lld", &a);
        v.PB(MP(a, 1));
    }
    scanf("%d", &m);
    forr(i, m)
    {
        scanf("%d", &tab[i].typ);
        if(tab[i].typ == 1)
        {
            scanf("%lld %lld", &tab[i].a, &tab[i].b);
        }
        else
        {
            scanf("%lld", &tab[i].a);
            if(tab[i].typ == 2)
                v.PB(MP(tab[i].a, -i));
        }
    }
    v.PB(MP(INF, 1));

    sort(v.begin(), v.end());
    n = v.size();
    S = 1;
    while(S <= n+3)
        S *= 2;

    forr(i, v.size())
    {
        if(v[i].second <= 0)
        {
            tab[-v[i].second].b = v[i].first;
            tab[-v[i].second].a = i;
        }
        else
        {
            d[i+S].g_ile = 1;
            d[i+S].g_maks = v[i].first;
            d[i+S].g_suma = v[i].first;
        }

//        cout << "rybka " << i << ": " << v[i].first << " (" << v[i].second << ")" << endl;
    }


    FORD(i, S-1, 0)
    {
        d[i].g_ile = d[i*2].g_ile + d[i*2+1].g_ile;
        d[i].g_suma = d[i*2].g_suma + d[i*2+1].g_suma;
        d[i].g_maks = max(d[i*2].g_maks, d[i*2+1].g_maks);
    }

    forr(i, m)
    {
        teraz++;

        if(tab[i].typ == 1) // przychodzi szczupak
        {
//            cout << " przychodzi szczupak o masie " << tab[i].a << ", chcący osiągnąć " << tab[i].b << endl;
            int res = 0;
            long long masa = tab[i].a;
            while(masa < tab[i].b)
            {
//                cout << "szuka maxa" << endl;
                pair<int, long long> p = znajdz_maks(masa);
                int poz = p.first;
                long long sum = p.second;
                long long potrzeba = min(tab[i].b, v[poz].first+1)-masa;
//                cout << "dla masy " << masa << " znalazl niemniejsza rybke nr " << poz << endl;
//                cout << "potrzebujemy jeszcze " << potrzeba << endl;
                if(potrzeba > sum)
                {
                    res = -1;
                    break;
                }
//                cout << "szuka sume" << endl;
                p = znajdz_sume(sum - potrzeba);
//                cout << " szukajac sumy " << sum - potrzeba << " wybralismy poczatek na rybce " << p.first <<  "(suma " << p.second << ")" << endl;
                masa += sum - p.second;
//                cout << " mamy mase " << masa << endl;
//                cout << "zdejmuje przedzial od " << p.first << " do " << poz-1 << endl;
                res += zlicz_i_zdejmij(1, 0, S-1, p.first, poz-1);
            }
            printf("%d\n", res);

        }
        else if(tab[i].typ == 2) // dokladamy rybke
        {
//            cout << "dokladamy rybke o masie " << tab[i].b << endl;
            dokladaj_g(tab[i].a, tab[i].b);
        }
        else if(tab[i].typ == 3) // zabieramy rybke
        {
            int x = znajdz_maks(tab[i].a).first;
//            cout << "zdejmujemy rybke o masie " << tab[i].a << " na pozycji " << x << endl;
            zdejmij_g(x);
        }

    }




    return 0;
}
