CSES - Shared codeLink to this code: https://cses.fi/paste/ca9af4ec3e878a8f2c400c/
#include <bits/stdc++.h>
using namespace std;
#define trace(x) clog << "=>" << #x << ":" << x << endl;
#define trace2(x, y) clog << "=>" << #x << ":" << x << endl <<"=>"<<#y << ":" << y << endl;
using ll = long long int;
using pii = pair<ll, ll>;
int mod = 1e9 + 7;
ll exp(ll base, ll pw) { ll ans = 1; while (pw > 0) { if (pw & 1) { ans *= base; } base *= base; pw >>= 1; } return ans; }
int add(ll a, ll b){ return (a%mod + b%mod)%mod; }
int mul(ll a, ll b){ return (a%mod * b%mod)%mod; }
int modexp(int base, int pw) { int ans = 1; while (pw > 0) { if (pw & 1) { ans = mul(ans,base); } base = mul(base, base); pw >>= 1; } return ans; }

void build(vector<ll> &v, vector<pii> &seg, int i, int l, int r){

	//if leaf
	if(l == r){
		seg[i].first = max<ll>(0, v[l-1]);
		seg[i].second = v[l-1];
		return;
	}

	int mid = (r - l)/2 + l;

	build(v, seg, 2*i, l, mid);
	build(v, seg, 2*i+1, mid+1, r);
	// max{best_pre(left), sum(left) + best_pre(right)}
	seg[i].first = max<ll>(0, max<ll>(seg[2*i].first, seg[2*i].second + seg[2*i+1].first));
	seg[i].second = seg[2*i].second + seg[2*i+1].second;

}

void update(vector<pii> &seg, int i, int l, int r, ll pos, ll val){
	//if leaf
	if(l == r){
		if(l == pos){
			seg[i].first = seg[i].second = val;
		}
		return;
	}

	int mid = (r - l)/2 + l;

	update(seg, 2*i, l, mid, pos, val);
	update(seg, 2*i+1, mid+1, r, pos, val);

	// max{best_pre(left), sum(left) + best_pre(right)}
	seg[i].first = max<ll>(0, max<ll>(seg[2*i].first, seg[2*i].second + seg[2*i+1].first));
	seg[i].second = seg[2*i].second + seg[2*i+1].second;

}

pii query(vector<pii> &seg, int i, int l, int r, int ql, int qr){
	//ql....qr  l....r || l....r ql...qr
 	if(qr < l || r < ql)return {0, 0};
 	//ql.....l,r.....qr
 	if(l >= ql && r <= qr)return seg[i];

 	int mid = (r-l)/2 + l;

 	pii left  = query(seg, 2*i, l, mid, ql, qr);
 	pii right = query(seg, 2*i+1, mid+1, r, ql, qr) ;

 	ll best_pre = max<ll>(0, max<ll>(left.first, left.second+right.first));
 	ll sum = left.second + right.second;

 	return {best_pre, sum};

}

void solve(){
	int n, q;
	cin>>n>>q;
	vector<ll> v(n);
	for(int i=0; i<n; i++)cin>>v[i];
 	vector<pii> seg(4*n+1);
	build(v, seg, 1, 1, n);

	for(int i=1; i<=q; i++){
		int type;
		cin>>type;
		if(type == 1){
			ll pos, val;
			cin>>pos>>val;
			update(seg, 1, 1, n, pos, val);
		}else{
			int a, b;
			cin>>a>>b;
			cout<<query(seg, 1, 1, n, a, b).first<<"\n";
		}
	}

}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	#ifndef ONLINE_JUDGE
		freopen("in.txt", "r", stdin);
		freopen("out.txt", "w", stdout);
	#endif
    int t;
    t = 1;
    while(t--){
    	solve();
    }
    return 0;
}