#include <fstream>
#define INF 2147483647
#define NMAX 262144
#define TLIM 1<<20
#define verifica ++contor == TLIM ? in.read(Text,TLIM),contor = 0 : 0
#define LS(p) (p<<1)
#define RS(p) ((p<<1)+1)
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
/**********************************/
char Text[TLIM+4];
int contor;
inline void Citeste(int &n)
{
if(Text[contor] == '\0')in.read(Text,TLIM);
else for(;Text[contor]<'0'||Text[contor]>'9';verifica);
for(n = 0; Text[contor]>='0'&&Text[contor]<='9';n = n*10 + Text[contor]-'0',verifica);
}
/**********************************/
int V[NMAX],N,T;
inline int _max(int a,int b){if(a>b)return a;return b;}
void Insert(int p,int poz,int s,int f,int val)
{
if(s == f)
V[p] = val;
else
{
int med = (s+f)/2;
if(poz<=med)
Insert(LS(p),poz,s,med,val);
else
Insert(RS(p),poz,med+1,f,val);
V[p] = _max(V[LS(p)],V[RS(p)]);
}
}
int Query(int p,int s,int f,int a,int b)
{
int med = (s+f)/2,v1 = -INF ,v2 = -INF ;
if(s>=a&&f<=b)
return V[p];
if(med>=a)
v1 = Query(LS(p),s,med,a,b);
if(med<b)
v2 = Query(RS(p),med+1,f,a,b);
return _max(v1,v2);
}
int main()
{
int i,x,a,b,op;
Citeste(N),Citeste(T);
for(i=1;i<=N;i++)
Citeste(x),Insert(1,i,1,N,x);
while(T--)
{
Citeste(op),Citeste(a),Citeste(b);
if(op)
Insert(1,a,1,N,b);
else
{
out<<Query(1,1,N,a,b)<<'\n';
}
}
return 0;
}