#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
vector<int> tree(4e5, 0);
void update(int node, int st, int dr, const int poz, const int val)
{
if(st == dr)
{
tree[node] = val;
return;
}
int mid = (st + dr) / 2;
if(poz <= mid)
update(node * 2, st, mid, poz, val);
else
update(node * 2 + 1, mid + 1, dr, poz, val);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
int query(int node, int st, int dr, const int Qst, const int Qdr)
{
if(Qst <= st && dr <= Qdr)
return tree[node];
int mid = (st + dr) / 2;
int ans = 0;
if(Qst <= mid)
ans = max(ans, query(node * 2, st, mid, Qst, Qdr));
if(Qdr > mid)
ans = max(ans, query(node * 2 + 1, mid + 1, dr, Qst, Qdr));
return ans;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++ i) {
int x;
cin >> x;
update(1, 1, n, i, x);
}
while (m --) {
int tip;
cin >> tip;
if (tip == 0) {
int st, dr;
cin >> st >> dr;
cout << query(1, 1, n, st, dr) << '\n';
}
else {
int pos, val;
cin >> pos >> val;
update(1, 1, n, pos, val);
}
}
return 0;
}