#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
namespace standard = std;
using namespace standard;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int arbMax = (2 * 131072 - 1) + 5;
const int NMax = 1E5 + 5;
namespace arbStuff {
void update(int,int,int,int,int);
int query(int,int,int,int,int);
}
int N,M;
int arb[arbMax];
int main() {
/*
int pw = 1;
while (pw < NMax) {
pw <<= 1;
}
out<<pw <<"\n\n\n";
*/
using arbStuff::query;
in>>N>>M;
for (int i=1;i<=N;++i) {
int val;
in>>val;
arbStuff::update(1,1,N,i,val);
}
while (M--) {
int tip,a,b;
in>>tip>>a>>b;
if (tip == 0) {
int val = query(1,1,N,a,b);
out<<val<<'\n';
}
else {
arbStuff::update(1,1,N,a,b);
}
}
in.close();out.close();
return EXIT_SUCCESS;
}
void arbStuff::update(int nod,int st,int dr,int poz,int val) {
if (st == dr) {
arb[nod] = val;
return;
}
int mij = (st+dr)>>1,
fSon = (nod<<1),
sSon = (nod<<1) + 1;
if (poz <= mij) {
arbStuff::update(fSon,st,mij,poz,val);
}
else {
arbStuff::update(sSon,mij+1,dr,poz,val);
}
arb[nod] = max(arb[fSon],arb[sSon]);
}
int arbStuff::query(int nod,int st,int dr,int a,int b) {
if (a <= st && dr <= b) {
return arb[nod];
}
int mij = (st+dr)>>1,
fSon = (nod<<1),
sSon = (nod<<1) + 1,
mx = 0;
if (a <= mij) {
mx = arbStuff::query(fSon,st,mij,a,b);
}
if (mij+1 <= b) {
mx = max(mx, arbStuff::query(sSon,mij+1,dr,a,b));
}
return mx;
}