#include <cstdio>
#include <algorithm>
#define LMAX 100005
#define INF 999999999
using namespace std;
FILE *fin=fopen("arbint.in", "r");
FILE *fout=fopen("arbint.out", "w");
int aib[4*LMAX];
int a[LMAX];
int n, m;
int tip, x, y;
void build(int nod, int st, int dr)
{
if (st>dr)
{
return;
}
if (st == dr)
{
aib[nod] = a[st];
return ;
}
int m = (st+dr)/2;
build(nod<<1, st, m);
build(nod<<1|1, m+1, dr);
aib[nod] = max(aib[nod<<1], aib[nod<<1|1]);
}
void update(int nod, int st, int dr, int x, int y)
{
if (st == dr)
{
aib[nod] = y;
return ;
}
int m = (st+dr)/2;
if (x<=m)
{
update(nod<<1, st, m, x, y);
}
else
{
update(nod<<1|1, m+1, dr, x, y);
}
aib[nod] = max(aib[nod<<1], aib[nod<<1|1]);
}
int query(int nod, int st, int dr, int x, int y)
{
if (x<=st&&dr<=y)
{
return aib[nod];
}
int ret = -INF;
int m = (st+dr)/2;
int v1 = -1, v2 = -1;
if (x<=m)
{
v1 = query(nod<<1, st, m, x, y);
}
if (y>m)
{
v2 = query(nod<<1|1, m+1, dr, x, y);
}
ret = max(ret, v1);
ret = max(ret, v2);
return ret;
}
int main()
{
fscanf(fin, "%d %d",&n,&m);
for (int i =1;i<=n;++i)
{
fscanf(fin, "%d",&a[i]);
}
build(1, 1, n);
for (int i=1;i<=m;++i)
{
fscanf(fin,"%d %d %d",&tip, &x, &y);
if (!tip)
{
fprintf(fout, "%d\n", query(1, 1, n, x, y));
}
else
{
update(1, 1, n, x, y);
}
}
fclose(fin);
fclose(fout);
return 0;
}