#include <cstdio>
#define N 131075
int n, m;
int a[N];
int b[N];
void createTree(int nod, int st, int dr) {
if(st == dr) {
b[nod] = st;
return;
}
int mij = (st + dr) / 2;
createTree(2 * nod, st, mij);
createTree(2 * nod + 1, mij + 1, dr);
if(a[b[2 * nod]] > a[b[2 * nod + 1]])
b[nod] = b[2 * nod];
else
b[nod] = b[2 * nod + 1];
}
void update(int nod, int st, int dr, int l) {
if (st == dr) {
return;
}
int mij = (st + dr) / 2;
if(l <= mij)
update(2 * nod, st, mij, l);
else
update(2 * nod + 1, mij + 1, dr, l);
if(a[b[2 * nod]] > a[b[2 * nod + 1]])
b[nod] = b[2 * nod];
else
b[nod] = b[2 * nod + 1];
}
int query(int nod, int st, int dr, int leftdat, int rightdat) {
if((leftdat <= st) && (rightdat >= dr))
return b[nod];
else {
int mij = (st + dr) / 2;
int left = 0;
int right = 0;
if (mij < leftdat) {
if (dr >= leftdat)
return query(2 * nod + 1, mij + 1, dr, leftdat, rightdat);
}
else
if (mij >= leftdat && mij < rightdat) {
left = query(2 * nod, st, mij, leftdat, rightdat);
right = query(2 * nod + 1, mij + 1, dr, leftdat, rightdat);
if (a[left] > a[right]) return left;
return right;
}
else {
if(st <= rightdat) {
return query(2 * nod, st, mij, leftdat, rightdat);
}
}
}
}
int main() {
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
createTree(1, 1, n);
for(int i = 1; i <= m; i++) {
int cod, l, r;
scanf("%d %d %d",&cod,&l,&r);
if(cod == 0) {
printf("%d\n", a[query(1, 1, n, l, r)]);
}
else {
a[l] = r;
update(1, 1, n, l);
}
}
return 0;
}