#include <bits/stdc++.h>
#define DIM 100001
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
vector <int> v(4 * DIM);
int n, query, task, poz, val, ans;
void Build(int node, int st, int dr){
if(st == dr)
fin >> v[node];
else {
int mij = (st + dr) >> 1;
Build(2 * node, st, mij);
Build(2 * node + 1, mij + 1, dr);
v[node] = max(v[2 * node], v[2 * node + 1]);
}
}
void Update(int node, int st, int dr, int a, int b){
if(st == dr)
v[node] = b;
else {
int mij = (st + dr) >> 1;
if(a <= mij)
Update(2 * node, st, mij, a, b);
else Update(2 * node + 1, mij + 1, dr, a, b);
v[node] = max(v[2 * node + 1], v[2 * node]);
}
}
int Query(int node, int st, int dr, int a, int b){
if(st > b || dr < a)
return 0;
if(a <= st && dr <= b)
return v[node];
else {
int mij = (st + dr) >> 1;
int ok1 = Query(2 * node, st, mij, a, b);
int ok2 = Query(2 * node + 1, mij + 1, dr, a, b);
return max(ok1, ok2);
}
}
int main(){
fin >> n >> query;
Build(1, 1, n);
while(query--){
fin >> task >> poz >> val;
if(task == 1)
Update(1, 1, n, poz, val);
else {
fout << Query(1, 1, n, poz, val) << "\n";
}
}
}