#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define pair<int, int> pi
#define mp make_pair
#define forr(X) for(int i = 0; i<X; i++)
#pragma GCC optimize("Ofast")
#define F first
#define all(X) X.begin(), X.end()
#define S second
//#define int ll
#define out(X) for(auto it: X){ for(auto ito : it)cout<<ito<<" "; cout<<endl;}
//#define MOD 1000000000000000031
int a[100000], n, m;
int c, x, y;
int mid(int start, int end){
return(start+(end-start)/2);
}
int construct(int st, int end, int *tree, int in){
if(st==end){
tree[in]=a[st];
return tree[in];
}
int mi = mid(st, end);
tree[in] = max(construct(st, mi, tree, in*2+1), construct(mi+1, end, tree, in*2+2));
return tree[in];
}
int maxt(int st, int end, int *tree, int in){
if(x>end || y<st){
return 0;
}
if(x<=st && y>=end){
return tree[in];
}
int mi = mid(st, end);
return max(maxt(st, mi, tree, in*2+1), maxt(mi+1, end, tree, in*2+2));
}
int updt(int st, int end, int *tree, int in){
if(st==end){
tree[in]=y;
return tree[in];
}
int mi = mid(st, end);
if(x<=mi){
tree[in] = max(tree[in*2+2], updt(st, mi, tree, in*2+1));
}
else{
tree[in] = max(tree[in*2+1], updt(mi+1, end, tree, in*2+2));
}
return tree[in];
}
void solve(){
cin>>n>>m;
forr(n){
scanf("%d", &a[i]);
}
int treel;
treel = int(pow(2, (int(ceil(log2(n)))+1))-1);
int tree[treel];
construct(0, n-1, tree, 0);
forr(m){
//cin>>c>>x>>y;
scanf("%d %d %d", &c, &x, &y);
if(c==0){
x--;
y--;//0-indexed
//cout<<maxt(0, n-1, tree, 0)<<endl;
printf("%d\n", maxt(0, n-1, tree, 0));
}
else{
x--;
updt(0, n-1, tree, 0);
}
}
}
int32_t main(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
//int t;cin>>t;while(t--)
solve();
}