#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int n, m, x, op, f, s;
vector<int> A;
int M[100001];
void initialize(int nod, int i, int j){
if (i == j) M[nod] = i;
else{
initialize(2 * nod, i, (i + (j - i) / 2));
initialize(2 * nod + 1, (i + (j - i) / 2) + 1, j);
//(A[M[2 * nod]] >= A[M[2 * nod + 1]])? M[nod] = A[M[2 * nod]] : M[nod] = A[M[2 * nod + 1]];
}
}
int query(int nod, int b, int e, int f, int s){
if (e < f || s < b) return -1;
if (b >= f && e <= s) return M[nod];
int p1 = query(2 * nod, b, (b + e) / 2, f, s);
int p2 = query(2 * nod + 1, (b + e) / 2 + 1, e, f, s);
//return the position where the overall
//minimum is
if (p1 == -1)
return M[nod] = p2;
if (p2 == -1)
return M[nod] = p1;
if (A[p1] >= A[p2])
return M[nod] = p1;
return M[nod] = p2;
}
int main(){
//freopen("arbint.in", "r", stdin);
//freopen("arbint.out", "w", stdout);
//scanf("%d%d", &n, &m);
cin >> n >> m;
for (int i = 0; i < n; i++){
// scanf("%d", &x);
cin >> x; A.push_back(x);
}
initialize(1, 0, n - 1);
for (int i = 0; i < m; i++){
cin >> op >> f >> s;
//scanf("%d%d%d", &op, &f, &s);
switch (op){
case 1:
query(1, 0, n-1, f, s);
break;
}
}
return 0;
}