#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, int el)
{
// if(st>dr)
// return;
if(st == dr)
{
if(st == el)
arb[poz_arb]=a[el];
return;
}
int med=(st+dr)/2;
upd(st, med, 2*poz_arb, el);
upd(med+1, dr, 2*poz_arb+1, el);
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>dr)
return -1;
if(st > b)
return -1;
if(dr < a)
return -1;
if(st >= a && dr <= b)
{
return arb[poz_arb];
}
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, i);
}
//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);
//afisare();
}
return 0;
}