#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 100002;
int v[NMAX];
// cea mai mare pozitie pe care se afla un element cu valoarea val sau -1 daca aceasta valoare nu se gaseste in sir
int binary_search0(int lo, int hi,int val)
{
int sol = -2;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (v[mid] == val) {
sol = mid;
lo = mid + 1;
}
else if (v[mid] < val)
lo = mid + 1;
else
hi = mid - 1;
}
return sol + 1; //indexat de la 1
}
//cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir.
//Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
int binary_search1(int lo, int hi,int val)
{
int sol = -2;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (v[mid] <= val) {
sol = mid;
lo = mid + 1;
}
else
hi = mid - 1;
}
return sol + 1;
}
//cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir.
//Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
int binary_search2(int lo, int hi,int val)
{
int sol = -2;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (v[mid] >= val) {
sol = mid;
hi = mid - 1;
}
else
lo = mid + 1;
}
return sol + 1;
}
int main()
{
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n, m;
fin >> n;
for (int i = 0; i < n; ++i)
fin >> v[i];
fin >> m;
while (m--) {
int op, val;
fin >> op >> val;
switch (op) {
case 0:
fout << binary_search0(0, n - 1, val) << "\n";
break;
case 1:
fout << binary_search1(0, n - 1, val) << "\n";
break;
case 2:
fout << binary_search2(0, n - 1, val) << "\n";
}
}
return 0;
}