#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMax = 1e5, oo = 0x3f3f3f3f;
int n, m;
int v[NMax + 5], aint[4 * NMax + 5];
void Read(){
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> v[i];
}
void Build(int node, int left, int right){
if (left == right){
aint[node] = v[left];
return;
}
int mid = (left + right) >> 1;
int leftson = 2 * node, rightson = leftson + 1;
Build(leftson, left, mid);
Build(rightson, mid + 1, right);
aint[node] = max(aint[leftson], aint[rightson]);
}
void Update(int node, int left, int right, int pos, int value){
if (left == right){
aint[node] = value;
return;
}
int mid = (left + right) >> 1;
int leftson = 2 * node, rightson = leftson + 1;
if (pos <= mid)
Update(leftson, left, mid, pos, value);
else
Update(rightson, mid + 1, right, pos, value);
aint[node] = max(aint[leftson], aint[rightson]);
}
int Query(int node, int left, int right, int leftquery, int rightquery){
if (leftquery <= left && right <= rightquery)
return aint[node];
int mid = (left + right) >> 1;
int leftson = 2 * node, rightson = leftson + 1;
int ans = -oo;
if (mid >= leftquery)
ans = max(ans, Query(leftson, left, mid, leftquery, rightquery));
if (mid + 1 <= rightquery)
ans = max(ans, Query(rightson, mid + 1, right, leftquery, rightquery));
return ans;
}
int main(){
Read();
Build(1, 1, n);
while (m--){
int type, a, b;
fin >> type >> a >> b;
if (type == 0)
fout << Query(1, 1, n, a, b) << '\n';
if (type == 1)
Update(1, 1, n, a, b);
}
return 0;
}