#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
class aint
{
public:
int maxim (int node, int st, int dr, int x, int y);
void update(int node, int st, int dr,int poz, int val);
void init(int node, int st, int dr);
void citire(int n);
private:
int a[NMAX*4];
int v[NMAX];
int maxa(int c, int b)
{
if(c>b)
return c;
return b;
}
};
int aint::maxim(int node, int st, int dr, int x, int y)
{
int mj=(dr+st)/2;
if(st==dr)
return a[node];
int max1=0;
int max2=0;
if(x<=mj)
max1=maxim(2*node, st, mj,x,y);
if(y>mj)
max2=maxim(2*node+1, mj+1, dr,x,y);
return maxa(max1, max2);
}
void aint::update(int node, int st, int dr,int poz, int val)
{
int mj=(dr+st)/2;
if(st==dr)
{a[node]=val;return;}
if(poz<=mj)
update(2*node,st,mj,poz,val);
else
update(2*node+1,mj+1,dr,poz,val);
a[node]=maxa(a[2*node], a[2*node+1]);
}
void aint::init(int node, int st, int dr)
{
int mj=(dr+st)/2;
if(st==dr)
{a[node]=v[st];return;}
init(2*node,st,mj);
init(2*node+1,mj+1,dr);
a[node]=maxa(a[2*node],a[2*node+1]);
}
void aint::citire(int n)
{int i,x;
for(i=1;i<=n;i++)
{cin>>x;v[i]=x;}
}
int n,m;
int main()
{aint x;
cin>>n>>m;
x.citire(n);
x.init(1,1,n);
for(int i=1;i<=m;i++)
{
int c,a,b;
cin>>c>>a>>b;
if(c==0)
cout<< x.maxim(1,1,n,a,b)<<'\n';
else
x.update(1,1,n,a,b);
}
return 0;
}