#include <bits/stdc++.h>
using namespace std;
const int nmax = 100005;
int aint[4*nmax],v[nmax];
int N,M;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
inline void Build(int nod, int st, int dr)
{
if(st == dr)
{
aint[nod] = v[st];
return;
}
int mij = (st+dr)/2;
Build(2*nod, st, mij);
Build(2*nod+1, mij+1, dr);
aint[nod] = max(aint[2*nod],aint[2*nod+1]);
}
inline void Update(int nod, int st, int dr, int p, int x)
{
if(st == dr)
{
aint[nod] = x;
return;
}
int mij = (st + dr)/2;
if(p <= mij) Update(2*nod, st, mij, p, x);
else Update(2*nod+1, mij + 1, dr, p, x);
aint[nod] = max(aint[2*nod],aint[2*nod+1]);
}
inline int Query(int nod, int st, int dr, int x, int y)
{
if(st == x && y == dr) return aint[nod];
int mij = (st + dr)/2;
if(y <= mij) return Query(2*nod, st, mij, x, y);
else if(x > mij) return Query(2*nod+1, mij+1, dr, x, y);
else return max(Query(2*nod, st, mij, x, mij),Query(2*nod+1, mij+1, dr, mij+1, y));
}
int main()
{
int i,a,b,c;
fin>>N>>M;
for(i = 1; i <= N; ++i) fin>>v[i];
Build(1,1,N);
for(i = 1; i <= M; ++i)
{
fin>>c>>a>>b;
if(c == 0) fout<< Query(1, 1, N, a, b) << "\n";
else Update(1, 1, N, a, b);
}
fout.close();
return 0;
}