#include <cstdio>
#define MAX 100000
using namespace std;
int arbore[4*MAX+66], maxim;
inline int max(int a, int b)
{
if(a>b)
return a;
return b;
}
void update(int l1, int l2, int nod, int poz, int val)
{
int mij;
if(l1==l2){
arbore[nod]=val;
return;
}
else
{
mij=(l1+l2)/2;
if(mij<poz)
update(mij+1, l2, nod*2+1,poz, val);
else update(l1, mij, nod*2,poz, val);
arbore[nod]=max(arbore[nod*2+1], arbore[nod*2]);
}
}
void query(int l1, int l2, int a, int b, int nod)
{
int mij;
if(l1>=a&&l2<=b)
maxim=max(maxim, arbore[nod]);
else
{
mij=(l1+l2)/2;
if(a<=mij) query(l1, mij, a, b, nod*2);
if(b>mij) query(mij+1, l2, a, b, nod*2+1);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, i, q, a, b;
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
{
scanf("%d", &a);
update(1, n, 1, i, a);
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d", &q, &a, &b);
if(q==1)
update(1, n,1,a, b);
else
{
maxim=-1;
query(1, n, a, b, 1);
printf("%d\n", maxim);
}
}
return 0;
}