Cloud clipboard
AC Code
使用线段树维护点修区间最大子段和的 AC 代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
#ifndef ONLINE_JUDGE
// #define OPEN_FILE
// #define OPEN_TIME
#endif
#define AC return 0;
#define lowbit(x) (x&(-x))
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
using namespace std;
const int maxn=1e6+10,INF=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-8,Pi=acos(-1);
mt19937_64 mt(1145);
int n,m;
int a[maxn];
struct Info{
ll ans,pre,suf,sum;
Info(){ans=pre=suf=-INF,sum=0;}
Info(ll a,ll p,ll s,ll t){ans=a,pre=p,suf=s,sum=t;}
Info(ll x){ans=x,pre=x,suf=x,sum=x;}
Info operator+(const Info &x)const{
return {max({ans,x.ans,suf+x.pre}),max(pre,sum+x.pre),max(x.suf,x.sum+suf),sum+x.sum};
}
};
struct SegTree{
struct Node{
Info sum;
}t[maxn<<2];
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define sum(p) t[p].sum
#define tag(p) t[p].tag
void PushUp(int p){
sum(p)=sum(ls(p))+sum(rs(p));
}
void Change(int p,int l,int r,int x,Info k){
if(l==r) return sum(p)=k,void();
int mid=l+r>>1;
if(x<=mid) Change(ls(p),l,mid,x,k);
else Change(rs(p),mid+1,r,x,k);
PushUp(p);
}
Info Query(int p,int l,int r,int L,int R){
if(L<=l&&R>=r) return sum(p);
if(l>R||r<L) return {};
int mid=l+r>>1;
return Query(ls(p),l,mid,L,R)+Query(rs(p),mid+1,r,L,R);
}
Info Query(int l,int r){
return Query(1,1,n,l,r);
}
void Change(int x,Info k){
Change(1,1,n,x,k);
}
void Build(int p,int l,int r){
sum(p)={};
if(l==r) return sum(p)={a[l]},void();
int mid=l+r>>1;
Build(ls(p),l,mid);
Build(rs(p),mid+1,r);
PushUp(p);
}
}t;
void solve() {
int opt,x,k;
while(m--) {
cin>>opt>>x>>k;
if(opt==2) t.Change(x,{k});
else cout<<t.Query(min(x,k),max(x,k)).ans<<"\n";
}
}
void init() {
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
t.Build(1,1,n);
}
int main() {
#ifdef OPEN_FILE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
#ifdef OPEN_TIME
auto StartTime=clock();
#endif
// ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int T=1;
// cin>>T;
// while(cin>>n) {
while(T--) {
init();
solve();
}
#ifdef OPEN_TIME
cerr<<"used: "<<(double)(clock()-StartTime)/CLOCKS_PER_SEC*1000<<" ms"<<endl;
#endif
AC
}