#include <bits/stdc++.h>
#define Lson(x) (x * 2)
#define Rson(x) (x * 2 + 1)
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100005], aint[200005], n;
int raspuns;
void Build(int left, int right, int node)
{
if(left == right)
{
aint[node] = v[left];
return;
}
int mid = (left + right) / 2;
Build(left, mid, Lson(node));
Build(mid + 1, right, Rson(node));
aint[node] = max(aint[Lson(node)], aint[Rson(node)]);
}
void Update(int left, int right, int node, const int &val, const int &poz)
{
if(left == right)
{
aint[node] = val;
return;
}
int mid = (left + right) / 2;
if(poz <= mid)
Update(left, mid, Lson(node), val, poz);
else
Update(mid + 1, right, Rson(node), val, poz);
aint[node] = max(aint[Lson(node)], aint[Rson(node)]);
}
void Query(int left, int right, int node, const int &RQuery, const int &LQuery)
{
if(LQuery <= left && right <= RQuery)
{
raspuns = max(raspuns,aint[node]);
return;
}
int mid = (left + right) / 2;
if(LQuery <= mid)
Query(left, mid, Lson(node), RQuery, LQuery);
if(mid < RQuery)
Query(mid + 1, right, Rson(node), RQuery, LQuery);
}
int main()
{
int task, m, Lq,Rq, poz, val;
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> v[i];
Build(1, n, 1);
for(int i = 1; i <= m; i++)
{
fin >> task;
if(task == 0)
{
fin >> Lq >> Rq;
raspuns = 0;
Query(1, n, 1, Rq, Lq);
fout << raspuns << "\n";
}
else
{
fin >> poz >> val;
Update(1, n, 1, val ,poz);
}
}
return 0;
}