#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, x, y, z, arb[4 * 500000 + 50], maximum;
void update(int left, int right, int node, int pos, int val)
{
if(left == right)
{
arb[node] = val;
return;
}
int mid = (left + right) >> 1;
if(pos <= mid)
update(left, mid, 2 * node, pos, val);
else
update(mid + 1, right, 2 * node + 1, pos, val);
arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
}
void query(int left, int right, int node, int a, int b, int *maximum)
{
if(a <= left && right <= b)
{
*maximum = max(*maximum, arb[node]);
return;
}
int mid = (left + right) >> 1;
if(mid >= a)
query(left, mid, 2 * node, a, b, maximum);
if(mid < b)
query(mid + 1, right, 2 * node + 1, a, b, maximum);
}
void read()
{
f>>n>>m;
for(int i = 1;i <= n;++i)
f>>x, update(1, n, 1, i, x);
}
void solve()
{
for(int i = 1;i <= m;++i)
{
f>>x>>y>>z;
if(!x)
{
maximum = -1;
query(1, n, 1, y, z, &maximum);
g<<maximum<<'\n';
}
else
update(1, n, 1, y, z);
}
}
int main()
{
read();
solve();
return 0;
}