#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
vector<int> t(4*nmax+5);
int v[nmax+5];
void build(int node, int left, int right) {
if(left==right) {
t[node] = v[left];
return ;
}
int mid = (left + right) / 2;
build(node*2,left,mid);
build(node*2+1,mid+1,right);
t[node] = max(t[node*2], t[node*2+1]);
}
void update(int node, int left, int right, int poz, int val) {
if(left==right) {
t[node] = val;
return ;
}
int mid = (left + right) / 2;
if(mid>=poz) update(node*2,left,mid,poz,val);
if(mid<poz) update(node*2+1,mid+1,right,poz,val);
t[node] = max(t[node*2], t[node*2+1]);
}
int query(int node, int left, int right, int st, int dr) {
if(st<=left and right<=dr)
return t[node];
int rez = 0;
int mid = (left + right) / 2;
if(mid>=st) rez = max(rez,query(node*2,left,mid,st,dr));
if(mid<dr) rez = max(rez,query(node*2+1,mid+1,right,st,dr));
return rez;
}
int main() {
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m; f >> n >> m;
for(int i=1; i<=n; i++) f >> v[i];
build(1,1,n);
for(int i=1; i<=m; i++) {
int op, x, y; f >> op >> x >> y;
if(op==0) g << query(1,1,n,x,y) << "\n";
else update(1,1,n,x,y);
}
return 0;
}