#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
const int SIZE = 1e5+10;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
int v[SIZE], arb[SIZE * 4];
void coutArb(int arb[], int ind, int st, int dr)
{
cout<<st<<" - "<<dr<<" : "<<arb[ind]<<"\n";
if(st==dr) return;
int mid = (st + dr) / 2;
coutArb(arb, ind*2, st, mid);
coutArb(arb, ind*2+1, mid+1, dr);
}
void coutArb(int arb[], int length)
{
coutArb(arb, 1, 1, length);
}
void buildArb(int arb[], int ind, int v[], int st, int dr)
{
if(st==dr) arb[ind] = v[st];
if(st>=dr) return;
int mid = (st + dr) / 2;
buildArb(arb, ind*2, v, st, mid);
buildArb(arb, ind*2+1, v, mid+1, dr);
arb[ind] = max(arb[ind*2], arb[ind*2+1]);
}
void buildArb(int arb[], int v[], int length)
{
buildArb(arb, 1, v, 1, length);
}
void readit()
{
in>>n>>m;
for(int i=1; i<=n; i++)
in>>v[i];
buildArb(arb, v, n);
///coutArb(arb, n);
}
int query(int arb[], int ind, int st, int dr, int a, int b)
{
if(a<=st && dr<=b) return arb[ind];
int mid = (st + dr) / 2, r1=0, r2=0;
if(a<=mid) r1 = query(arb, ind*2, st, mid, a, b);
if(mid<b) r2 = query(arb, ind*2+1, mid+1, dr, a, b);
return max(r1, r2);
}
void update(int arb[], int ind, int st, int dr, int pos, int val)
{
if(st==dr)
{
arb[ind] = val;
return;
}
int mid = (st + dr) / 2;
if(pos<=mid) update(arb, ind*2, st, mid, pos, val);
else update(arb, ind*2+1, mid+1, dr, pos, val);
arb[ind] = max(arb[ind*2], arb[ind*2+1]);
}
int main()
{
int qry, a, b;
readit();
for(int i=1; i<=m; i++)
{
in>>qry>>a>>b;
if(!qry) out<<query(arb, 1, 1, n, a, b)<<"\n";
else update(arb, 1, 1, n, a, b);
}
return 0;
}