线段树
#include<bits/stdc++.h>#define ll long long#define dl double#define fo(i,a,b) for (int i=a;i<=b;i++)#define println(x){printf(":\n");for (int tmpi=1;tmpi<=n;tmpi++)printf("%d ",x[i]);printf("\n");}using namespace std;const int N=1e5+7;const int INF=0x3f3f3f3f;const int M=1e9+7;class poi{public:ll l,r,sum,maxx,add,lc,rc;};class seg{public:vector<poi> s;void bulid(ll x){if (s[x].lc) return;ll l=s[x].l,r=s[x].r,mid=(l+r)>>1;s.push_back((poi){l,mid,0,0,0,0,0});s[x].lc=s.size()-1;s.push_back((poi){mid+1,r,0,0,0,0,0});s[x].rc=s.size()-1;}void pushdown(ll x){bulid(x);ll lc=s[x].lc,rc=s[x].rc;s[lc].add+=s[x].add;s[lc].sum+=s[x].add*(s[lc].r-s[lc].l+1);s[rc].add+=s[x].add;s[rc].sum+=s[x].add*(s[rc].r-s[rc].l+1);updata(x);}void updata(ll x){s[x].add=0;s[x].sum=s[s[x].lc].sum+s[s[x].rc].sum;s[x].maxx=max(s[s[x].lc].maxx,s[s[x].rc].maxx);}void add(ll x,ll l,ll r,ll t){if (l<=s[x].l&&s[x].r<=r){s[x].sum+=t*(s[x].r-s[x].l+1);s[x].add+=t;s[x].maxx+=t;return;}else{pushdown(x);if (l<=s[s[x].lc].r){add(s[x].lc,l,r,t);}if (r>=s[s[x].rc].l){add(s[x].rc,l,r,t);}updata(x);}}ll query_sum(ll x,ll l,ll r){if (l<=s[x].l&&s[x].r<=r){return s[x].sum;}else{pushdown(x);ll tmp=0;if (l<=s[s[x].lc].r){tmp+=query_sum(s[x].lc,l,r);}if (r>=s[s[x].rc].l){tmp+=query_sum(s[x].rc,l,r);}return tmp;}}ll query_max(ll x,ll l,ll r){if (l<=s[x].l&&s[x].r<=r){return s[x].maxx;}else{pushdown(x);ll tmp=0;if (l<=s[s[x].lc].r){tmp=max(tmp,query_max(s[x].lc,l,r));}if (r>=s[s[x].rc].l){tmp=max(tmp,query_max(s[x].rc,l,r));}return tmp;}}}tree;int n;int m;ll l,r,t;ll a;void read(){scanf("%d",&n);tree.s.push_back((poi){1,n,0,0,0,0,0});for (int i=1;i<=n;i++){scanf("%lld",&a);tree.add(0,i,i,a);}tree.add(0,1,2,4);cout<<tree.query_max(0,1,4);/*scanf("%d",&m);char ch[5];for (int i=1;i<=m;i++){scanf("%s",ch);if (ch[0]=='S'){scanf("%lld%lld",&l,&r);printf("%lld\n",tree.sum(0,l,r));}if (ch[0]=='A'){scanf("%lld%lld%lld",&l,&r,&t);tree.add(0,l,r,t);}}*/}int main(){read();return 0;}
快读
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
