#include <cstdio>
#include <algorithm>
#define NMAX 100005
using namespace std;
int a[NMAX], arb[4*NMAX], n, m, op, in, sf;
void upd(int st, int dr, int poz_arb)
{
if(st == dr)
{
arb[poz_arb]=a[st];
return;
}
int med=(st+dr)/2;
upd(st, med, 2*poz_arb);
upd(med+1, dr, 2*poz_arb+1);
arb[poz_arb]=max(arb[2*poz_arb], arb[2*poz_arb+1]);
}
int cauta(int st, int dr, int poz_arb, int a, int b)
{
if(st >= a && dr <= b)
return arb[poz_arb];
if(st > b || dr < a)
return -1;
int med=(st+dr)/2;
int cst=cauta(st, med, 2*poz_arb, a, b);
int cdr=cauta(med+1, dr, 2*poz_arb+1, a, b);
return max(cst, cdr);
}
void updQ(int st, int dr, int poz_arb, int poz, int el)
{
if(st == dr)
{
if(st == poz)
arb[poz_arb]=el;
return;
}
int med=(st+dr)/2;
updQ(st, med, 2*poz_arb, poz, el);
updQ(med+1, dr, 2*poz_arb+1, poz, el);
arb[poz_arb]=max(arb[2*poz_arb], arb[2*poz_arb+1]);
}
void afisare()
{
for(int i=1; i<=4*n; i++)
printf("%d ", arb[i]);
printf("\n");
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
}
upd(1, n, 1);
//printf("%d", arb[1]);
for(int i=1; i<=m; i++)
{
scanf("%d %d %d", &op, &in, &sf);
if(op == 0)
printf("%d\n", cauta(1, n, 1, in, sf));
else
updQ(1, n, 1, in, sf);
}
return 0;
}