#include<cstdio>

#define SZPROTKI 400005

long long int wagi[SZPROTKI];

long long int korzen = 0;
long long int liczba_wezlow = 0;
long long int zapytanie = 0;

struct Wezel {
	long long int rodzic;
	long long int lewy_syn;
	long long int prawy_syn;

	long long int wartosc;

	long long int liczebnosc;
	long long int lewa_liczebnosc;
	long long int prawa_liczebnosc;

	long long int biezace_zapytanie;

	long long int aktualna_liczebnosc;
	long long int aktualna_lewa_liczebnosc;
	long long int aktualna_prawa_liczebnosc;

	long long int tryb;

	Wezel() {
		rodzic = -1;
		lewy_syn = -1;
		prawy_syn = -1;

		wartosc = -1;

		liczebnosc = 0;
		lewa_liczebnosc = 0;
		prawa_liczebnosc = 0;

		biezace_zapytanie = -1;

		aktualna_liczebnosc = 0;
		aktualna_lewa_liczebnosc = 0;
		aktualna_prawa_liczebnosc = 0;

		tryb = 0; // -1 = lewy, 1 = prawy, 0 = korzeń
	}

	void print() {
		printf("rodzic = %lld, lewy syn = %lld, prawy syn = %lld, wartosc = %lld, liczebnosc = %lld\n", rodzic, lewy_syn, prawy_syn, wartosc, liczebnosc);
	}

	bool isDirty() {
		return biezace_zapytanie != zapytanie;
	}

	void unDirty() {
		if (! isDirty()) {
			return;
		}

		biezace_zapytanie = zapytanie;
		aktualna_liczebnosc = liczebnosc;
		aktualna_lewa_liczebnosc = lewa_liczebnosc;
		aktualna_prawa_liczebnosc = prawa_liczebnosc;
	}

	long long int aktualnie_dostepne() {
		unDirty();

		return aktualna_liczebnosc;
	}

	long long int aktualnie_dostepne_po_lewej() {
		unDirty();

		return aktualna_lewa_liczebnosc;
	}

	long long int aktualnie_dostepne_po_prawej() {
		unDirty();

		return aktualna_prawa_liczebnosc;
	}
};

Wezel wezly[SZPROTKI];

long long int uzyj(long long int wskaznik) {
	wezly[wskaznik].unDirty();

	wezly[wskaznik].aktualna_liczebnosc--;
	long long int wynik = wezly[wskaznik].wartosc;

	while(wezly[wskaznik].rodzic != -1) {
		long long int rodzic = wezly[wskaznik].rodzic;
		wezly[rodzic].unDirty();

		// jestem lewym synem
		if (wezly[wskaznik].tryb == -1) {
			wezly[rodzic].aktualna_lewa_liczebnosc--;

		// jestem prawym synem
		} else if (wezly[wskaznik].tryb == 1) {
			wezly[rodzic].aktualna_prawa_liczebnosc--;
		}

		wskaznik = rodzic;
	}

	return wynik;
}


void dodajSzprotke(long long int waga) {
	long long int wskaznik = korzen;

	// pusty korzeń
	if (wezly[wskaznik].wartosc == -1) { // lub liczba_wezlow == 0
		wezly[wskaznik].wartosc = waga;
		wezly[wskaznik].liczebnosc = 1;
		wezly[wskaznik].lewa_liczebnosc = 0; // zbędne
		wezly[wskaznik].prawa_liczebnosc = 0; // zbędne
		wezly[wskaznik].tryb = 0;

		liczba_wezlow++;

		return;
	}

	while (true) {
		// znaleziony
		if (waga == wezly[wskaznik].wartosc) {
			wezly[wskaznik].liczebnosc++;

			return;

		} else if (waga < wezly[wskaznik].wartosc) {
			wezly[wskaznik].lewa_liczebnosc++;

			// jest lewy syn
			if (wezly[wskaznik].lewy_syn != -1) {
				wskaznik = wezly[wskaznik].lewy_syn;

			// tworzymy lewego syna
			} else {
				wezly[liczba_wezlow].wartosc = waga;
				wezly[liczba_wezlow].liczebnosc = 1;
				wezly[liczba_wezlow].rodzic = wskaznik;
				wezly[liczba_wezlow].tryb = -1;

				wezly[wskaznik].lewy_syn = liczba_wezlow;

				liczba_wezlow++;

				return;
			}

		} else if (waga > wezly[wskaznik].wartosc) {
			wezly[wskaznik].prawa_liczebnosc++;

			// jest prawy syn
			if (wezly[wskaznik].prawy_syn != -1) {
				wskaznik = wezly[wskaznik].prawy_syn;

			// tworzymy prawego syna
			} else {
				wezly[liczba_wezlow].wartosc = waga;
				wezly[liczba_wezlow].liczebnosc = 1;
				wezly[liczba_wezlow].rodzic = wskaznik;
				wezly[liczba_wezlow].tryb = 1;

				wezly[wskaznik].prawy_syn = liczba_wezlow;

				liczba_wezlow++;

				return;
			}

		}
	}
}

void usunWezel(long long int wezel) {
	//TODO
}

void rownowazenie_drzewa() {
	//TODO
}

void usunSzprotke(long long int waga) {
	long long int wskaznik = korzen;

	while (true) {
		// znaleziony
		if (waga == wezly[wskaznik].wartosc) {
			wezly[wskaznik].liczebnosc--;

			if (wezly[wskaznik].liczebnosc == 0) {
				usunWezel(wskaznik);
			}

			return;

		} else if (waga < wezly[wskaznik].wartosc) {
			wezly[wskaznik].lewa_liczebnosc--;

			wskaznik = wezly[wskaznik].lewy_syn;

		} else if (waga > wezly[wskaznik].wartosc) {
			wezly[wskaznik].prawa_liczebnosc--;

			wskaznik = wezly[wskaznik].prawy_syn;
		}
	}
}

// TODO zoptymalizowac do O(1)??
long long int znajdz_dostepne_minimum(long long int wskaznik) {
	while(true) {
		wezly[wskaznik].unDirty();

		if (wezly[wskaznik].aktualnie_dostepne_po_lewej() > 0) {
			wskaznik = wezly[wskaznik].lewy_syn;

		} else if (wezly[wskaznik].aktualnie_dostepne() > 0) {
			return wezly[wskaznik].wartosc;

		} else {
			wskaznik = wezly[wskaznik].prawy_syn;
		}
	}
}

long long int znajdz_mniejsze_lub_rowne(long long int waga) {
	if (waga <= 0) {
		return -1;
	}

	long long int wskaznik = korzen;

	while (true) {
		if (wezly[wskaznik].wartosc > waga) {
			if (wezly[wskaznik].aktualnie_dostepne_po_lewej() > 0) {
				wskaznik = wezly[wskaznik].lewy_syn;

			} else {
				return -1;
			}

		} else if (wezly[wskaznik].wartosc == waga) {
			if (wezly[wskaznik].aktualnie_dostepne() > 0) {
				return wskaznik;

			} else if (wezly[wskaznik].aktualnie_dostepne_po_lewej() > 0) {
					wskaznik = wezly[wskaznik].lewy_syn;

			} else {
				return -1;
			}

		} else if (wezly[wskaznik].wartosc < waga) {
			if (wezly[wskaznik].aktualnie_dostepne_po_prawej() > 0 && znajdz_dostepne_minimum(wezly[wskaznik].prawy_syn) <= waga) {
				wskaznik = wezly[wskaznik].prawy_syn;

			} else if (wezly[wskaznik].aktualnie_dostepne() > 0) {
				return wskaznik;

			} else if (wezly[wskaznik].aktualnie_dostepne_po_lewej() > 0) {
				wskaznik = wezly[wskaznik].lewy_syn;

			} else {
				return -1;
			}
		}
	}
}

long long int znajdz_mniejsze(long long int waga) {
	return znajdz_mniejsze_lub_rowne(waga - 1);
}

long long int atak_szczupaka(long long int waga_poczatek, long long int waga_koniec) {
	zapytanie++;

	if (waga_poczatek >= waga_koniec) {
		return 0;
	}

	if (waga_poczatek == 1) {
		return -1;
	}

	long long int wynik = 0;
	while (waga_poczatek < waga_koniec) {
		long long int wskaznik = znajdz_mniejsze(waga_poczatek);

		if (wskaznik == -1) {
			return -1;
		}

		wynik++;
		waga_poczatek += uzyj(wskaznik);
	}

	return wynik;
}

int main() {
	long long int n;
	long long int q;

	scanf("%lld", &n);

	for (long long int i = 0; i < n; i++) {
		scanf("%lld", &wagi[i]);
		dodajSzprotke(wagi[i]);
	}

	scanf("%lld", &q);

	for (long long int i = 0; i < q; i++) {
		long long int a, b, c;

		scanf("%lld", &a);

		// atak szczupaka
		if (a == 1) {
			scanf("%lld %lld", &b, &c);

			long long int wynik = atak_szczupaka(b, c);
			printf("%lld\n", wynik);

		// dodanie szprotki
		} else if (a == 2) {
			scanf("%lld", &b);

			dodajSzprotke(b);

		//usunięcie szprotki
		} else if (a == 3) {
			scanf("%lld", &b);

			usunSzprotke(b);
		}
	}

	return 0;
}
