#include <fstream>
#define nmax 100001
#define max(a,b) (a>b)?a:b
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int AINT[2*nmax+10], N, Q, maxim;
void Update(int R, int st, int dr, int POZ, int VAL)
{
if(st==dr) {
AINT[R] = VAL;
return;
}
int mij = (st+dr)/2;
if(POZ <= mij)
Update(2*R, st, mij, POZ, VAL);
if(POZ > mij)
Update(2*R+1, mij+1, dr, POZ, VAL);
AINT[R] = max(AINT[2*R], AINT[2*R+1]);
}
void citire()
{
int X;
fin>>N>>Q;
for(int i=1; i<=N; i++)
{
fin>>X;
Update(1, 1, N, i, X);
}
}
void Query(int R, int st, int dr, int A, int B)
{
if(A<=st && dr<=B) {
maxim = max(maxim, AINT[R]); return;
}
int mij = (st+dr)/2;
if(A <= mij)
Query(2*R, st, mij, A, B);
if(mij < B)
Query(2*R+1, mij+1, dr, A, B);
}
int main()
{
citire();
int key, a, b;
while(Q--)
{
fin>>key>>a>>b;
if(key==0) {
Query(1, 1, N, a, b); fout << maxim <<'\n';
maxim = -1;
}
else Update(1, 1, N, a, b);
}
return 0;
}