#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 1e5+5;
int n, q, ARB[NMAX*4], ans;
inline void update(int node, int left, int right, int pos, int val)
{
if(left == right)
{
ARB[node] = val;
}
else
{
int mid = (left + right) / 2;
if(pos <= mid)
update(node*2, left, mid, pos, val);
else
update(node*2+1, mid+1,right, pos, val);
ARB[node] = max(ARB[node*2], ARB[node*2+1]);
}
}
inline void query(int node, int left, int right, int ArbL, int ArbD)
{
if(left > ArbD || right < ArbL)
return;
if(ArbD <= right && ArbL >= left)
{
ans = max(ans, ARB[node]);
return;
}
int mid = (ArbL + ArbD) / 2;
query(2*node, left, right, ArbL, mid);
query(2*node+1, left, right, mid+1, ArbD);
}
int main()
{
fin >> n >> q;
for(int i = 1; i <= n; ++ i)
{
int num;
fin >> num;
update(1, 1, n, i, num);
}
while(q--)
{
bool op;
int a, b;
fin >> op >> a >> b;
if(!op)
{
ans = 0;
query(1, a, b, 1, n);
fout << ans << '\n';
}
else
update(1, 1, n, a, b);
}
}