Twinkle_M @ 2019-07-24 23:51:04
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
struct node{
int lmax,rmax,sum,dat;
}tree[4000005];
int n;
int a[1000005];
void pushup(int now){
tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
tree[now].lmax=max(tree[now*2].lmax,tree[now*2+1].lmax+tree[now*2].sum);
tree[now].rmax=max(tree[now*2+1].rmax,tree[now*2+1].sum+tree[now*2].rmax);
tree[now].dat=max(tree[now*2].dat,tree[now*2+1].dat);
tree[now].dat=max(tree[now].dat,tree[now*2].rmax+tree[now*2+1].lmax);
}
void build(int now,int l,int r){
if(l==r){
tree[now].dat=tree[now].rmax=tree[now].lmax=tree[now].sum=a[l];
return;
}
int mid=(l+r)/2;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
pushup(now);
}
void change(int now,int l,int r,int x,int v){
if(l==r&&l==x){
tree[now].dat=tree[now].rmax=tree[now].lmax=tree[now].sum=v;
return;
}
int mid=(l+r)/2;
if(x<=mid)
change(now*2,l,mid,x,v);
else
change(now*2+1,mid+1,r,x,v);
pushup(now);
}
int query(int now,int l,int r,int lt,int lr){
if(l<=lt&&r>=lr)
return tree[now].dat;
int mid=(lt+lr)/2;
if(r<=mid)
return query(now << 1, l, r,lt, mid);
else if (l > mid) return query(now << 1 | 1, l, r,mid+1, lr);
else return query(now << 1, l, mid, lt, mid) + query(now << 1 | 1, mid+1, r,mid+1, lr);
}
int main(){
int m;
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1, 1, n);
for (int i = 1; i <= m; ++i){
int k, x, y;
scanf("%d%d%d", &k, &x, &y);
if (k == 1) {
if (x > y) swap(x, y);
printf("%d\n", query(1, x,y, 1, n));
} else {
change(1, 1, n, x, y);
}
}
return 0;
}