#include <bits/stdc++.h>
using namespace std;
ifstream in ("arbint.in");
ofstream out("arbint.out");
int maxim, poz, val, o, n, m, a[100010], arb[400010];
void build(int st = 1, int dr = n, int nod = 1)
{
if(st == dr)
{
arb[nod] = a[st];
return ;
}
int mij = (st + dr) / 2;
build(st, mij, nod * 2);
build(mij + 1, dr, nod * 2 + 1);
}
void update(int poz, int nod, int st, int dr)
{
if(st == dr)
{
arb[nod] = val;
return;
}
int med = (st + dr) / 2;
if(med >= poz)
update(poz, nod * 2, st, med);
else
update(poz, nod * 2 + 1, med + 1, dr);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
void query(int x, int y, int nod, int st, int dr)
{
if(st >= x && dr <= y)
{
maxim = max(maxim, arb[nod]);
return;
}
int med = (st + dr) / 2;
if(med >= x)
query(x, y, nod * 2, st, med);
if(y >= med)
query(x, y, nod * 2 + 1, med + 1, dr);
}
int main()
{
in >> n >> m;
for(int i = 1;i <= n;i++)
in >> a[i];
build();
for(int i = 1;i <= m;i++)
{
in >> o >> poz >> val;
if(o == 0)
{
maxim = 0;
query(1, n, 1, poz, val);
out << maxim << '\n';
}
else
update(poz, 1, 1, n);
}
return 0;
}