#include <stdio.h>
#include <iostream>
#define NMAX 100005
using namespace std;
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
int n,A[NMAX],v[4*NMAX],i,q,cerinta,a,b;
void build(int nod, int left, int right)
{
if(left == right)
{
v[nod] = A[left];
return;
}
int mid = (left+right) /2;
build(2*nod, left, mid);
build(2*nod+1, mid+1, right);
v[nod] = max(v[2*nod], v[2*nod+1]);
}
void update(int nod, int left, int right)
{
if(left == right)
{
v[nod] = b;
return;
}
int mid = (left+right) /2;
if(a <= mid)
update(2*nod, left, mid);
else
update(2*nod+1, mid+1, right);
v[nod] = max(v[2*nod], v[2*nod+1]);
}
int query(int nod, int left, int right)
{
int r1 = 0, r2 = 0;
if(a<=left and right<=b)
return v[nod];
int mid = (left+right) /2;
if(a <= mid)
r1 = query(2*nod, left, mid);
if(b > mid)
r2 = query(2*nod+1, mid+1, right);
return max(r1, r2);
}
int main()
{
fscanf(fin, "%d%d", &n,&q);
for(i=1; i<=n; ++i)
fscanf(fin, "%d", &A[i]);
build(1, 1, n);
while(q)
{
fscanf(fin, "%d%d%d", &cerinta,&a,&b);
if(cerinta)
update(1, 1, n);
else
fprintf(fout, "%d\n", query(1, 1, n));
--q;
}
fclose(fin);
fclose(fout);
return 0;
}