#include <fstream>
using namespace std;
const int NMAX = 100000;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[4*NMAX + 100], maxx;
void update(int node, int st, int dr, int pos, int val)
{
if(st == dr)
{
aint[node] = val;
return;
}
int med = ((st + dr) >> 1);
if(pos <= med)
update(2 * node,st,med,pos,val);
else
update(2 * node + 1,med + 1,dr,pos,val);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
void query(int node, int st, int dr, int start, int fin)
{
if(start <= st and dr <= fin)
{
maxx = max(maxx, aint[node]);
return;
}
int med = ((st + dr) >> 1);
if(start <= med)
query(2 * node,st,med,start,fin);
if(med < fin)
query(2 * node + 1,med + 1,dr,start,fin);
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(NULL);
int n,m,i,op,x,y;
fin >> n >> m;
for(i = 1; i <= n; i++)
{
fin >> x;
update(1,1,n,i,x);
}
while(m--)
{
fin >> op >> x >> y;
if(op)
update(1,1,n,x,y);
else
{
maxx = -1;
query(1,1,n,x,y);
fout << maxx << "\n";
}
}
return 0;
}