#include <fstream>
#include <cstdio>
#define inf 1e9
using namespace std;
ofstream g("arbint.out");
struct NODE{
int val;
NODE *left,*right;
NODE(int _val,NODE *_left,NODE *_right) : val(_val) , left(_left) , right(_right){};
};
NODE *Aint;
int N=1,n,m,x,y,t;
void update(NODE *r,int L,int R,int nod,int val)
{
if (L==R)
{
r->val = val;
return;
}
int mid = (L+R)/2;
if (r->left == NULL)
{
r->left = new NODE(-inf,NULL,NULL);
r->right = new NODE(-inf,NULL,NULL);
}
if (nod<=mid)
update(r->left,L,mid,nod,val);
else
update(r->right,mid+1,R,nod,val);
r->val = max(r->left->val,r->right->val);
}
int query(NODE *r,int L,int R,int st,int dr)
{
if (st<=L && R<=dr)
return r->val;
int mid = (L+R)/2;
int a = -inf,b = -inf;
if (r->left == NULL)
{
r->left = new NODE(-inf,NULL,NULL);
r->right = new NODE(-inf,NULL,NULL);
}
if (st<=mid && dr>=L)
a = query(r->left,L,mid,st,dr);
if (dr>=mid && st<=R)
b = query(r->right,mid+1,R,st,dr);
return max(a,b);
}
int main()
{
freopen("arbint.in","r",stdin);
scanf("%d%d",&n,&m);
Aint = new NODE(-inf,NULL,NULL);
while (N<n)
N<<=1;
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
update(Aint,1,N,i,x);
}
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&t,&x,&y);
if (t==1)
update(Aint,1,N,x,y);
else
g<<query(Aint,1,N,x,y)<<'\n';
}
return 0;
}