#include <fstream>
using namespace std;
//ifstream fin("arbint.in");
//ofstream fout("arbint.out");
int v[400002];
void update(int nod, int poz, int x, int st, int dr)
{
if(st==dr) v[nod]=x;
else
{int m=(st+dr)/2;
if(poz<=m) update(2*nod, poz, x, st, m);
else update(2*nod+1, poz, x, m+1, dr);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
}
int query(int nod, int st, int dr, int a, int b)
{int m1=0, m2=0;
if(st>=a && dr<=b) return v[nod];
else {int m=(st+dr)/2;
if(m>=a) { m1=query(2*nod, st, m, a, b);}
if(m<b) { m2=query(2*nod+1, m+1, dr, a, b);}
return max(m1, m2);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int k, a, b, n, m;
//fin>>n>>m;
scanf("%i%i", &n,&m);
for(int i=1;i<=n;i++)
{
//fin>>k;
scanf("%i", &k);
update(1,i,k,1,n);
}
for(int i=1;i<=m;i++)
{
//fin>>k>>a>>b;
scanf("%i%i%i", &k,&a,&b);
if(k==0) printf("%i%c",query(1,1,n,a,b),'\n');
//fout<<query(1,1,n,a,b)<<'\n';
else
update(1,a,b,1,n);
}
return 0;
}