#include <iostream>
#include <fstream>
#include <climits>
#define nmax 100001
using namespace std;
int n, m, val, pos, s, f, maxim;
bool type;
int ARB[4*nmax];
void update(int nod, int st, int dr, int val, int pos)
{
if (st == dr)
{
ARB[nod] = val;
return;
}
int mid = (st + dr) >> 1;
if (pos <= mid) update(2*nod, st, mid, val, pos);
else update(2*nod+1, mid+1, dr, val, pos);
ARB[nod] = max(ARB[2*nod], ARB[2*nod+1]);
}
void query(int nod, int st, int dr, int s, int f)
{
if (s <= st && dr <= f)
{
maxim = max(maxim, ARB[nod]);
return;
}
int mid = (st + dr) >> 1;
if (s <= mid) query(2*nod, st, mid, s, f);
if (f > mid) query(2*nod+1, mid+1, dr, s, f);
}
int main()
{
ifstream fi("arbint.in");
ofstream fo("arbint.out");
fi >> n >> m;
for (int pos = 1; pos <= n; pos++)
{
fi >> val;
update(1, 1, n, val, pos);
}
for (int i = 1; i <= m; i++)
{
fi >> type;
if (type)
{
fi >> pos >> val;
update(1, 1, n, val, pos);
}
else
{
fi >> s >> f;
maxim = -INT_MAX;
query(1, 1, n, s, f);
fo << maxim << "\n";
}
}
fi.close();
fo.close();
return 0;
}