#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int INF = 0x3f3f3f3f3f3f3f3f;
int n, m;
int v[100100], tree[400400];
void update(int node, int l, int r, int pos, int val)
{
if(l == r)
{
tree[node] = val;
return;
}
int mid = (l + r) / 2;
int nLeft = node * 2, nRight = node * 2 + 1;
if(pos <= mid)
update(nLeft, l, mid, pos, val);
else
update(nRight, mid + 1, r, pos, val);
tree[node] = max(tree[nLeft], tree[nRight]);
}
int query(int node, int l, int r, int qLeft, int qRight)
{
if(qLeft <= l && r <= qRight)
return tree[node];
int rez = -INF;
int mid = (l + r) / 2;
int nLeft = node * 2, nRight = (node * 2) + 1;
if(qLeft <= mid)
rez = max(rez, query(nLeft, l, mid, qLeft, qRight));
if(mid < qRight)
rez = max(rez, query(nRight, mid + 1, r, qLeft, qRight));
return rez;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
in >> v[i];
update(1, 1, n, i, v[i]);
//cout << i << ' ' << query(1, 1, n, 1, n) << '\n';
}
while(m--)
{
int t, x, y;
in >> t >> x >> y;
if(t == 0)
out << query(1, 1, n, x, y) << '\n';
else
update(1, 1, n, x, y);
}
return 0;
}