#include <fstream>
#include<climits>
#define maxN 100005
using namespace std;
int A[4*maxN+5],v[maxN],sol,i,n,m,op,a,b;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
void build(int nod, int st, int dr) {
if (st == dr)
A[nod] = v[st];
else {
int mid = (st+ dr)/2;
build(2*nod, st, mid);
build(2*nod+1, mid+1, dr);
A[nod] = max(A[2*nod], A[2*nod+1]);
}
}
void update(int nod, int st, int dr, int p, int x) {
if (st == dr)
A[nod] = x;
else {
int mid = (st+ dr)/2;
if (p <= mid)
update(2*nod, st, mid, p, x);
if (p > mid)
update(2*nod+1, mid+1, dr,p,x);
A[nod] = max(A[2*nod], A[2*nod+1]);
}
}
void query(int nod, int st, int dr, int a, int b) {
if (a <= st && dr <= b)
sol = max(sol, A[nod]);
else {
int mid = (st+ dr)/2;
if (a <= mid)
query(2*nod, st, mid, a, b);
if (b > mid)
query(2*nod+1, mid+1, dr, a, b);
}
}
int main () {
fin>>n>>m;
for (i=1;i<=n;i++)
fin>>v[i];
build(1, 1, n);
for(int i=1;i<=m;i++)
{
fin>>op>>a>>b;
if(op==0)
{
sol=0;
query(1,1,n,a,b);
fout<<sol<<'\n';
}
else
{
update(1,1,n,a,b);
}
}
return 0;
}