#include <fstream>
#define DMAX 100
using namespace std;
FILE * fin = fopen ("arbint.in", "r");
FILE * fout = fopen ("arbint.out", "w");
void citire();
void update(int, int, int, int, int);
int query(int, int, int, int, int);
int n, m;
int tree[4*DMAX];
int main(int argc, const char * argv[])
{
citire();
int i, c, a, b;
for (i=1; i<=m; i++)
{
fscanf(fin, "%d %d %d", &c, &a, &b);
if (c==0)
fprintf(fout, "%d\n", query(1, 1, n, a, b));
else
update(1, 1, n, a, b);
}
fclose(fin);
fclose(fout);
return 0;
}
void citire()
{
int i, x;
fscanf(fin, "%d %d", &n, &m);
for (i=1; i<=4*DMAX; i++) tree[i]=-1;
for (i=1; i<=n; i++)
{
fscanf(fin, "%d", &x);
update(1, 1, n, i, x);
}
}
void update(int nod, int st, int dr, int pos, int x)
{
if (st==dr)
{
tree[nod]=x;
return;
}
int mij=(st+dr)/2;
if (pos<=mij)
update (nod*2, st, mij, pos, x);
else
update (nod*2+1, mij+1, dr, pos, x);
//actualizare
if (tree[nod*2]>tree[nod*2+1])
tree[nod]=tree[nod*2];
else
tree[nod]=tree[nod*2+1];
}
int query (int nod, int st, int dr, int a, int b)
{
if (a<=st && dr<=b)
return tree[nod];
int mij=(st+dr)/2, rs=-1, rd=-1;
if (a<=mij)
rs = query (nod*2, st, mij, a, b);
if (b>mij)
rd = query (nod*2+1, mij+1, dr, a, b);
if (rs>rd) return rs;
return rd;
}