#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, q;
int segmTree[400005];
void update(int val, int target, int a, int b, int pos);
int query(int lft, int rgt, int a, int b, int pos);
int main()
{
fin >> n >> q;
for(int i = 1; i <= n; ++i){
int x;
fin >> x;
update(x, i, 1, n, 1);
}
while(q--){
int task;
fin >> task;
if(task){
int a, b;
fin >> a >> b;
update(b, a, 1, n, 1);
}
else{
int a, b;
fin >> a >> b;
fout << query(a, b, 1, n, 1) << "\n";
}
}
return 0;
}
void update(int val, int target, int a, int b, int pos){
if(a == b){
segmTree[pos] = val;
return;
}
int mid = (a + b) / 2;
if(target <= mid) update(val, target, a, mid, 2 * pos);
else update(val, target, mid + 1, b, 2 * pos + 1);
segmTree[pos] = max(segmTree[2 * pos], segmTree[2 * pos + 1]);
}
int query(int lft, int rgt, int a, int b, int pos){
if(a == lft && b == rgt) return segmTree[pos];
int mid = (a + b) / 2;
if(rgt <= mid) return query(lft, rgt, a, mid, 2 * pos);
else if(lft > mid) return query(lft, rgt, mid + 1, b, 2 * pos + 1);
else return max(query(lft, mid, a, mid, 2 * pos), query(mid + 1, rgt, mid + 1, b, 2 * pos + 1));
}