#include <cstdio>
using namespace std;
#define MAX 100001
int v[MAX], n, m, arb[3*MAX], a, b, cod;
void update(int nod, int left, int right, int pos); //poz=0 pt bulid
int query(int nod, int left, int right); //a si b setate inainte de apel
int main()
{
int i;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++)
scanf("%d", v+i);
update(1, 1, n, 0);
for(i=1; i<=m; i++){
scanf("%d%d%d", &cod, &a, &b);
if(cod==1){
v[a] = b;
update(1, 1, n, a);
}
else
printf("%d\n", query(1, 1, n));
}
return 0;
}
int query(int nod, int left, int right)
{
if(a<=left and right<=b)
return arb[nod];
int mj = (left+right)/2, maxleft=0, maxright=0;
if(a<=mj)
maxleft = query(nod*2, left, mj);
if(mj<b)
maxright = query(nod*2+1, mj+1, right);
return maxleft>maxright?maxleft:maxright;
}
void update(int nod, int left, int right, int poz)
{
if(left==right)
arb[nod] = v[left];
else{
int mj = (left+right)/2;
if(poz==0 or poz<=mj)
update(nod*2, left, mj, poz);
if(poz==0 or poz>mj)
update(nod*2+1, mj+1, right, poz);
arb[nod] = arb[nod*2]>arb[nod*2+1]?arb[nod*2]:arb[nod*2+1];
}
}