1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; const ll MAXN=static_cast<ll>(5e5)+10,MIN=-1e17+9,que=MAXN-10; ll N,M;
struct Tree { int l=0,r=0; ll maxLeft,maxRight,sum,ans; }tr[MAXN*4];
inline void merge(int k) { int lson = k*2,rson=k*2+1; tr[k].sum=tr[lson].sum+tr[rson].sum; tr[k].maxLeft=max(tr[lson].maxLeft,tr[lson].sum+tr[rson].maxLeft); tr[k].maxRight=max(tr[rson].maxRight,tr[lson].maxRight+tr[rson].sum); tr[k].ans=max({tr[lson].ans,tr[rson].ans,tr[lson].maxRight+tr[rson].maxLeft}); } inline Tree mergeTr(Tree lt,Tree rt) { Tree res; res.sum=lt.sum+rt.sum; res.maxLeft=max(lt.maxLeft,lt.sum+rt.maxLeft); res.maxRight=max(rt.maxRight,lt.maxRight+rt.sum); res.ans=max({lt.ans,rt.ans,lt.maxRight+rt.maxLeft}); return res; } void buildTree(int x,int l,int r) { if(l==r) { tr[x].l=tr[x].r=l; tr[x].sum=tr[x].ans=tr[x].maxLeft=tr[x].maxRight=MIN; return; } tr[x].l=l,tr[x].r=r; tr[x].sum=tr[x].ans=tr[x].maxLeft=tr[x].maxRight=MIN; int mid=l+r>>1; buildTree(x*2,l,mid); buildTree(x*2+1,mid+1,r); }
void change(int x,int pos,ll sc) { if(tr[x].l==pos && tr[x].r==pos) { tr[x].sum=tr[x].ans=tr[x].maxLeft=tr[x].maxRight=sc; return; } int mid=tr[x].l+tr[x].r>>1; if(pos>mid) change(x*2+1,pos,sc); else change(x*2,pos,sc); merge(x); } Tree query(int x,int l,int r) { if(l<=tr[x].l && tr[x].r<=r) { return tr[x]; } int mid=tr[x].l+tr[x].r>>1;
if(l>mid) { return query(x*2+1,l,r); }else{ if(r<=mid) { return query(x*2,l,r); }else { Tree ltree,rtree; ltree=query(x*2,l,r); rtree=query(x*2+1,l,r); return mergeTr(ltree,rtree); } } } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>N>>M; buildTree(1,1,N); for(int i=1;i<=N;++i) { ll a; cin>>a; change(1,i,a); } for(int i=1;i<=M;++i) { ll op; cin>>op; if(op==1) { ll a,b; cin>>a>>b; if(a>b) swap(a,b); cout<<query(1,a,b).ans<<'\n'; }else { int pos;ll s; cin>>pos>>s; change(1,pos,s); } } return 0; }
|