#include <bits/stdc++.h>
using namespace std;
const int inf = 2000000000;
int n, m, v[100005], arb[4*1005], lazy[4*1005];
void build(int nod, int x, int y)
{
if(x == y){
arb[nod] = v[x];
}else{
int m = (x+y)/2;
build(nod*2, x, m);
build(nod*2+1, m+1, y);
arb[nod] = max(arb[nod*2], arb[nod*2+1]);
}
}
void update(int nod, int st, int dr, int i, int j, int val)
{
if(lazy[nod] != 0){
arb[nod] = lazy[nod];
if(st != dr){
lazy[nod*2] += lazy[nod];
lazy[nod*2+1] += lazy[nod];
}
lazy[nod] = 0;
}
if(st >= i && dr <=j){
arb[nod] = val;
if(st != dr){
lazy[nod*2] = val;
lazy[nod*2+1] = val;
}
return;
}
int m = (st+dr)/2;
if(m >= i)
update(nod*2, st, m, i, j, val);
if(m < j)
update(nod*2+1, m+1, dr, i, j, val);
arb[nod] = max(arb[nod*2], arb[nod*2+1]);
}
int query(int nod, int st, int dr, int i, int j)
{
if(lazy[nod] != 0){
arb[nod] = lazy[nod];
if(st != dr){
lazy[nod*2] += lazy[nod];
lazy[nod*2+1] += lazy[nod];
}
lazy[nod] = 0;
}
if(st >= i && dr <= j)
return arb[nod];
int m = (st+dr)/2, ans = -inf;
if(m >= i)
ans = query(nod*2, st, m, i, j);
if(m < j)
ans = max(ans, query(nod*2+1, m+1, dr, i, j));
return ans;
}
int main()
{
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> v[i];
build(1, 1, n);
while(m--){
int t, x, y, c;
cin >> t;
if(t == 0){
cin >> x >> y;
cout << query(1, 1, n, x, y) << "\n";
}else{
//cin >> x >> y >> c;
cin >> x >> c;
update(1, 1, n, x, x, c);
}
}
return 0;
}