#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=50005;
int n,m;
int arr[MAXN];
struct Node{
int l,r,d,ld,rd;
}tree[MAXN*4];
void push_up(int id){
tree[id].ld=tree[id*2].ld;
if(tree[id*2].ld==tree[id*2].r-tree[id*2].l+1){
tree[id].ld+=tree[id*2+1].ld;
}
tree[id].rd=tree[id*2+1].rd;
if(tree[id*2+1].rd==tree[id*2+1].r-tree[id*2+1].l+1){
tree[id].rd+=tree[id*2].rd;
}
tree[id].d=max(max(tree[id*2].d,tree[id*2+1].d),tree[id*2+1].ld+tree[id*2].rd);
}
void build(int id,int l,int r){
tree[id]={l,r,0,0,0};
if(l==r){
tree[id].d=tree[id].ld=tree[id].rd=arr[l];
return;
}
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
push_up(id);
}
int query(int id,int x,int y){
if(x<=tree[id].l && tree[id].r<=y){
return tree[id].d;
}
int d=0;
int mid=(tree[id].l+tree[id].r)/2;
if(tree[id*2].d>=d && x<=mid){
d=query(id*2,x,y);
}
if(tree[id*2].rd+tree[id*2+1].ld>=d){
d=tree[id*2].rd+tree[id*2+1].ld;
}
if(tree[id*2+1].d>=d && y>mid){
d=query(id*2+1,x,y);
}
return d;
}
void update(int id,int l,int d){
if(l==tree[id].l && tree[id].l==tree[id].r){
tree[id].ld=tree[id].rd=tree[id].d=d;
return;
}
int mid=(tree[id].r+tree[id].l)/2;
if(l<=mid){
update(id*2,l,d);
}else{
update(id*2+1,l,d);
}
push_up(id);
}
signed main(){
cin>>n;
cin>>m;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int op,d,x;
cin>>op>>d>>x;
if(d>x){
swap(d,x);
}
if(op==1){
cout<<query(1,d,x)<<'\n';
}else{
update(1,d,x);
}
}
return 0;
}
感觉是update错了