#include<fstream>
#define maxn 500000
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arb[maxn];
int maxim = 0;
void update(int left, int right, int node, int pos, int value) {
if(left == right) {
arb[node] = value;
return;
}
int middle = left + (right - left) / 2;
if(pos <= middle) update(left, middle, node * 2, pos, value);
else update(middle + 1, right, node * 2 + 1, pos, value);
arb[node] = max(arb[2 * node], arb[2 * node + 1]);
}
void query(int left, int right, int node, int start, int finish) {
if(start <= left && right <= finish) {
if(maxim < arb[node]) maxim = arb[node];
return;
}
int middle = (left + right) / 2;
if(start <= middle) query(left, middle, 2 * node, start, finish);
if(middle < finish) query(middle + 1, right, 2 * node + 1, start, finish);
}
int main() {
int n, m, x, y, z;
in>>n>>m;
for(int i = 0; i < n; i++) {
in>>x;
update(1, n, 1, i + 1, x);
}
for(int i = 0; i < m; i++) {
in>>x>>y>>z;
if(x == 0) {
maxim = 0;
query(1,n,1,y,z);
out<<maxim<<"\n";
}
else update(1,n,1,y,z);
}
}