#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)
{
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (v[mid] > val)
hi = mid;
else
lo = mid + 1;
}
if (!lo || v[hi] < val)
return -1;
if (v[lo] == val)
return lo;
if (v[lo - 1] == val)
return lo - 1;
return -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)
{
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (v[mid] > val)
hi = mid;
else
lo = mid + 1;
}
if (v[lo] > val)
return lo - 1;
return lo;
}
//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)
{
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (v[mid] >= val)
hi = mid;
else
lo = mid + 1;
}
return lo;
}
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) << endl;
break;
case 1:
fout << binary_search1(0, n - 1, val) + 1 << endl;
break;
case 2:
fout << binary_search2(0, n - 1, val) + 1<< endl;
}
}
return 0;
}