#include <bits/stdc++.h>
#define NMAX 100000
#define endl '\n'
#define optimize ios::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
const int Lungime = NMAX * 4 + 99;
int v[NMAX];
int aint[Lungime];
int mx(int a, int b)
{
if (a > b)
return a;
return b;
}
void build(int node, int st, int dr)
{
if (st == dr)
{
aint[node]=v[st];
return;
}
int mid = (st + dr) / 2;
build(2 * node, st, mid);
build(2 * node + 1, mid + 1, dr);
aint[node] = mx(aint[2 * node] , aint[2 * node + 1]) ;
}
void update(int pos, int val, int node, int st, int dr)
{
if (st == dr)
{
aint[node] = val;
return;
}
int mid = (st + dr) / 2;
if (pos <= mid)
{
update(pos, val, 2 * node, st, mid);
}
else
update(pos, val, 2 * node + 1, mid + 1, dr);
aint[node] = mx(aint[2 * node + 1], aint[2 * node]);
}
int query(int x, int y, int node, int st, int dr)
{
if (dr < x || y < st)
{
return 0;
}
if (x <= st && dr <= y)
{
return aint[node];
}
int mid = (st + dr) / 2;
int qst = query(x, y, 2 * node, st, mid);
int qdr = query(x, y, 2 * node + 1, mid + 1, dr);
return mx(qst,qdr);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
optimize
int n;
int t;
cin >> n >> t;
for (int i = 1; i <= n; i++)
{
cin>>v[i];
}
build(1, 1, n);
while (t--)
{
int op, st, dr;
cin >> op >> st >> dr;
if (op)
{
update(st, dr, 1, 1, n);
}
else
{
cout << query(st, dr, 1, 1, n) << endl;
}
}
}