#include <bits/stdc++.h>
using namespace std;
#define maxd 100000
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int intervale[4 * maxd];
void update(int p, int position, int value, int left, int right){
if(left == right) {
intervale[p] = value;
return;
}
int m = (left + right ) / 2;
if(position > m) update(2 * p + 1, position, value, m + 1, right);
else update(2 * p, position, value, left, m);
intervale[p] = max(intervale[2 * p], intervale[2 * p + 1]);
}
int maxim;
void query(int p, int st, int dr, int left, int right){
if(left >= st && right <= dr) {
maxim = max(maxim, intervale[p]);
return;
}
int m = (left + right ) / 2;
if(st <= m) query(2 * p, st, dr, left, m);
else query(2 * p + 1, st, dr, m + 1, right);
}
int main()
{
int type, n, m, x;
fin >> n >> m;
for(int i = 1; i <= n; ++i){
fin >> x;
update(1, i, x, 1, n);
}
for(int i = 1; i <= m; ++i){
fin >> type;
if(type == 1){
int pos, val;
fin >> pos >> val;
update(1, pos, val, 1, n);
}
else{
int st, dr;
fin >> st >> dr;
maxim = 0;
query(1, st, dr, 1, n);
fout << maxim << '\n';
}
}
return 0;
}