求调find函数
#include<bits/stdc++.h>
using namespace std;
struct Node{
long long lma,rma;
long long int w,ma;
int l,r;
}nod[8000001];
void read(long long int &x){
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x*=10;
x+=ch-'0';
ch=getchar();
}
x*=f;
}
long long int w[1000001];
void push_up(int p){
nod[p].w=nod[p*2].w+nod[p*2+1].w;
nod[p].lma=max(nod[p*2].lma,nod[p*2].w+nod[p*2+1].lma);
nod[p].rma=max(nod[p*2+1].rma,nod[p*2+1].w+nod[p*2].rma);
nod[p].ma=max(nod[p*2].rma+nod[p*2+1].lma,max(nod[p*2].ma,nod[p*2+1].ma));
}
void New_Tree(int l,int r,int p){
int mid=l+r>>1;
nod[p].l=l;
nod[p].r=r;
if(l==r){
nod[p].w=w[l];
nod[p].ma=w[l];
nod[p].lma=w[l];
nod[p].rma=w[l];
return;
}
New_Tree(l,mid,p*2);
New_Tree(mid+1,r,p*2+1);
push_up(p);
}
void abb(int l,int r,int p,int cnt,int val){
int mid=l+r>>1;
if(l==r){
nod[p].w=val;
nod[p].ma=val;
nod[p].lma=val;
nod[p].rma=val;
return;
}
if(cnt>mid){
abb(mid+1,r,p*2+1,cnt,val);
push_up(p);
}
else{
abb(l,mid,p*2,cnt,val);
push_up(p);
}
}
long long int find(int l,int r,int p){
int mid=nod[p].l+nod[p].r>>1;
if(l==nod[p].l&&r==nod[p].r){
return nod[p].w;
}
if(l<=mid&&r>mid){
return max(nod[p*2].rma+nod[p*2+1].lma,max(nod[p*2].lma,nod[p*2+1].rma));
}
else if(r<=mid){
return find(l,mid,p*2);
}
else{
return find(mid+1,r,p*2+1);
}
}
int main(){
long long int n,m;
read(n);
read(m);
for(int i=1;i<=n;i++){
read(w[i]);
}
New_Tree(1,n,1);
long long int ma=0;
for(int i=1;i<=m;i++){
long long int op,x,y;
read(op);
read(x);
read(y);
if(op==0){
abb(1,n,1,x,y);
continue;
}
else{
cout<<find(x,y,1)<<'\n';
}
}
printf("%lld",ma);
return 0;
}