#include <fstream>
#define nmax 400005
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arbore[nmax];
int x, caz, a, b, maxim, n, m;
void update(int nod, int poz, int start, int ending, int val)
{
int mid;
if(start == ending)
{
arbore[nod] = val;
return;
}
mid = (start+ending)/2;
if(poz <= mid)
{
update(2*nod,poz,start, mid, val);
}
else
{
update(2*nod + 1, poz, mid+1, ending, val);
}
arbore[nod] = max(arbore[2*nod], arbore[2*nod+1]);
}
int findingmax(int nod, int st, int dr, int start, int ending)
{
int mid, ans = -1;
if(st >= start && dr <= ending)
{
return arbore[nod];
}
mid = (st + dr)/2;
if(start <= mid)
{
ans = findingmax(2*nod, st, mid, start, ending);
}
if(mid < ending)
{
ans = max(ans,findingmax(2*nod+1, mid+1, dr, start, ending));
}
return ans;
}
int main()
{
in>>n>>m;
for(int i=1; i<=n; i++)
{
in>>x;
update(1, i, 1, n , x);
}
/*for(int i=1; i<=9; i++)
{
out<<arbore[i]<<" ";
}*/
for(int i=1; i<=m; i++)
{
in>>caz>>a>>b;
if(caz == 0)
{
out<<findingmax(1, 1, n, a, b)<<"\n";
}
else
{
update(1, a, 1, n, b);
}
}
return 0;
}