#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
struct bound {
int val;
int poz;
};
int bs (int v[100001],int x,int st,int dr)
{
int mij=st+(dr-st)/2;
if (st<=dr)
{
if (v[mij]==x)
{
while (v[mij+1]==x)
{
mij++;
}
return mij;
}
if (v[mij]<x)
{
return bs(v,x,mij+1,dr);
}
if (v[mij]>x)
return bs(v,x,st,mij-1);
}
else return -1;
}
int low_bound (int v[100001],int x,int st,int dr,bound lb)
{
int mij=st+(dr-st)/2;
while (st<=dr)
{
if (v[mij]==x)
{
while (v[mij+1]==x)
{
mij++;
}
return mij;
}
else if (v[mij]<x)
{
if (v[mij]>lb.val)
{
lb.val=v[mij];
lb.poz=mij;
}
if (v[mij]<lb.val) return lb.poz;
return low_bound (v,x,mij+1,dr,lb);
}
if (v[mij]>x)
{
return low_bound (v,x,st,mij-1,lb);
}
}
if (st>dr) return lb.poz;
}
int up_bound(int v[100001],int x,int st,int dr,bound ub)
{
int mij=st+(dr-st)/2;
while (st<=dr)
{
if (v[mij]==x)
{
while (v[mij-1]==x)
{
mij--;
}
return mij;
}
else if (v[mij]>x)
{
if (v[mij]<ub.val)
{
ub.val=v[mij];
ub.poz=mij;
}
if (v[mij]>ub.val) return ub.poz;
return up_bound (v,x,st,mij-1,ub);
}
if (v[mij]<x)
{
return up_bound (v,x,mij+1,dr,ub);
}
}
if (st>dr) return ub.poz;
}
int main()
{
int n,v[100001],m,c,x;
bound lb,ub;
ub.val=INT_MAX;
lb.val=INT_MIN;
fin>>n;
for (int i=1;i<=n;i++)
{
fin>>v[i];
}
fin >> m;
for (int i=1;i<=m;i++)
{
fin>>c>>x;
if (c==0)
{
fout<< bs (v,x,1,n) << '\n';
}
if (c==1)
{
fout<<low_bound(v,x,1,n,lb) << '\n';
}
if (c==2)
{
fout<<up_bound (v,x,1,n,ub) << '\n';
}
}
return 0;
}