#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 100005
#define INF 1000000010
int n, m, ai[NMAX * 4], a[NMAX];
pair<int, int> seg[NMAX * 4];
void BuildTree(int node, int low, int high) {
seg[node].first = low;
seg[node].second = high;
if(low == high) {
ai[node] = a[low];
return;
}
int mid = (low + high)/2;
BuildTree(node * 2 + 1, low, mid);
BuildTree(node * 2 + 2, mid + 1, high);
ai[node] = max( ai[node * 2 + 1], ai[node * 2 + 2] );
}
void Update(int node, int low, int high, int poz, int val) {
if(low == high && low == poz) {
ai[node] = val;
return;
}
int mid = (low + high)/2;
if(low <= poz && poz <= mid)
Update(node * 2 + 1, low, mid, poz, val);
else
Update(node * 2 + 2, mid+1, high, poz, val);
ai[node] = max( ai[node * 2 + 1], ai[node * 2 + 2] );
}
int querry(int node, int low, int high) {
if(low <= seg[node].first && high >= seg[node].second)
return ai[node];
if(low > seg[node].second || high < seg[node].first)
return (-1) * INF;
int mid = (low + high)/2;
int left = querry(node * 2 + 1, low, high);
int right = querry(node * 2 + 2, low, high);
return max( left, right );
}
int main(){
int i, j, x, y, test;
FILE *fin, *fout;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
fscanf(fin, "%d %d", &n, &m);
for(i=0; i<n; i++)
fscanf(fin, "%d ", &a[i]);
BuildTree(0, 0, n-1);
for(i=1; i<=m; i++) {
fscanf(fin, "%d ", &test);
if(!test) {
fscanf(fin, "%d %d", &x, &y);
x--;
y--;
fprintf(fout, "%d\n", querry(0, x, y));
}
else {
fscanf(fin, "%d %d", &x, &y);
x--;
Update(0, 0, n-1, x, y);
}
}
return 0;
}