#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <type_traits>
#include <random>
#include <bitset>
#include <cstring>
#include <chrono>
#include <stack>
#include <stdlib.h>
#include <map>
#include <set>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define SERVER 0
const string nameFile="arbint";
ifstream in (nameFile+".in");
ofstream out(nameFile+".out");
typedef long long ll;
typedef pair <int, int> pii;
#if (SERVER)
#define in cin
#define out cout
#endif
const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count();
struct chash {
int operator()(int x) const { return x ^ RANDOM; }
};
struct segNode{
int data;
segNode (int vv=0){
data=vv;
}
friend segNode operator + (segNode s1, segNode s2){
return segNode(max(s1.data, s2.data));
}
};
class segTree{
public:
gp_hash_table <int, segNode, chash> seg;
int segSize;
segTree(int n){
segSize=n;
}
void pointUpdate(int poz, int val){
updateUtil(0, 0, segSize-1, poz, val);
}
segNode rangeQuery(int ll, int rr){
return queryUtil(0, 0, segSize-1, ll, rr);
}
private:
inline segNode getAt(int poz){
return (seg.find(poz)==seg.end()) ? segNode() : seg[poz];
}
void updateUtil(int poz, int ll, int rr, int pozQQ, int valQQ){
if(pozQQ>rr||pozQQ<ll)
return;
if(ll==rr){
seg[poz]=segNode(valQQ);
return;
}
int mij=(ll+rr)/2;
updateUtil(poz+1, ll, mij, pozQQ, valQQ);
updateUtil(poz+2*(mij-ll+1), mij+1, rr, pozQQ, valQQ);
seg[poz]=getAt(poz+1)+getAt(poz+2*(mij-ll+1));
}
segNode queryUtil(int poz, int ll, int rr, int llQ, int rrQ){
if(llQ<=ll&&rr<=rrQ)
return getAt(poz);
int mij=(ll+rr)/2;
if(llQ<=mij&&mij+1<=rrQ)
return queryUtil(poz+1, ll, mij, llQ, rrQ)+queryUtil(poz+2*(mij-ll+1), mij+1, rr, llQ, rrQ);
else if(llQ<=mij)
return queryUtil(poz+1, ll, mij, llQ, rrQ);
else if(mij+1<=rrQ)
return queryUtil(poz+2*(mij-ll+1), mij+1, rr, llQ, rrQ);
}
};
/*const int nmax=1e5;
int n, x;
int a[nmax+2];
vector <int> nr[nmax+2];*/
int n, qq, x, y, z;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
/*in>>n;
for(int i=1; i<=n; i++){
in>>a[i];
nr[a[i]].push_back(i);
}*/
in>>n>>qq;
segTree arb(n+1);
for(int i=1; i<=n; i++){
in>>x;
arb.pointUpdate(i, x);
}
for(int i=1; i<=qq; i++){
in>>x>>y>>z;
if(x==0)
out<<arb.rangeQuery(y, z).data<<"\n";
else
arb.pointUpdate(y, z);
}
return 0;
}