#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,q;
vector<int> st;
void update(int node,int from,int to,int value,int pos) {
if(from == to) {
st[node] = value;
return;
}
int mid = (from + to) / 2;
if(pos <= mid) {
update(node * 2,from,mid,value,pos);;
}else{
update(node * 2 + 1,mid + 1,to,value,pos);
}
st[node] = max(st[node * 2],st[node * 2 + 1]);
}
int query(int node,int lq,int rq,int l,int r) {
int smax = 0;
if(lq<=l and r<=rq) return st[node];
int mid = (l + r) / 2;
if(lq<=mid){
int sm = query(node * 2,lq,rq,l,mid);
smax = max(sm,smax);
}
if(mid+1 <= rq) {
int sm = query(node * 2 + 1,lq,rq,mid + 1,r);
smax = max(smax,sm);
}
return smax;
}
int main()
{
fin >> n >> q;
st.resize(n * 4 + 5);
int x;
for(int i = 1;i<=n;i++) {
fin >> x;
update(1,1,n,x,i);
}
int cer,y;
while(q--) {
fin >> cer >> x >> y;
if(cer == 0){
fout << query(1,x,y,1,n) << '\n';
}else{
update(1,1,n,y,x);
}
}
return 0;
}