#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e15;
struct no{
ll pp, nn, np, pn, okp, okn, pok, nok, okok;
no(){ pp = -INF, nn = -INF, np = -INF, pn = -INF, okok = 0;}
};
const int MAXN = 2*1e5+5;
int a[MAXN];
ll lz[MAXN*4];
no seg[MAXN*4];
no merge(no a, no b){
no resp;
resp.pp = max( { a.pp, b.pp, a.pok + b.okp, a.pn + b.pp, a.pp + b.np } );
resp.pn = max( { a.pn, b.pn, a.pok + b.okn, a.pn + b.pn, a.pp + b.nn } );
resp.np = max( { a.np, b.np, a.nok + b.okp, a.nn + b.pp, a.np + b.np } );
resp.nn = max( { a.nn, b.nn, a.nok + b.okn, a.nn + b.pn, a.np + b.nn } );
resp.okp = max( { a.okp, b.okp, a.okok + b.okp, a.okn + b.pp, a.okp + b.np } );
resp.okn = max( { a.okn, b.okn, a.okok + b.okn, a.okn + b.pn, a.okp + b.nn } );
resp.pok = max( { a.pok, b.pok, a.pok + b.okok, a.pn + b.pok, a.pp + b.nok } );
resp.nok = max( { a.nok, b.nok, a.nok + b.okok, a.nn + b.pok, a.np + b.nok } );
resp.okok = max( { a.okok + b.okok, a.okn + b.pok, a.okp + b.nok } );
return resp;
}
void build(int node, int l, int r){
if(l == r){
seg[node].okn = -a[l]; seg[node].nok = -a[l];
seg[node].okp = a[l]; seg[node].pok = a[l];
return;
}
int mid = (l+r)/2, e = node*2,d = node*2+1;
build(e,l,mid); build(d,mid+1,r);
seg[node] = merge(seg[e], seg[d]);
}
void refresh(int node, int l, int r){
seg[node].pp += 2*lz[node];
seg[node].nn -= 2*lz[node];
seg[node].okp += lz[node]; seg[node].pok += lz[node];
seg[node].okn -= lz[node]; seg[node].nok -= lz[node];
if(l != r){
lz[node*2] += lz[node];
lz[node*2+1] += lz[node];
}
lz[node] = 0;
}
void update(int node, int l, int r, int& i, int& j, int& x){
refresh(node,l,r);
if(j < l || r < i)return;
if(i <= l && r <= j){
lz[node] += x;
refresh(node,l,r);
return;
}
int mid = (l+r)/2,e = node*2,d = node*2+1;
update(e,l,mid,i,j,x); update(d,mid+1,r,i,j,x);
seg[node] = merge(seg[e], seg[d]);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,q; cin>>n>>q;
for(int i = 1; i <= n; i++)cin>>a[i];
build(1,1,n);
while(q--){
int l,r,x; cin>>l>>r>>x;
update(1,1,n,l,r,x);
refresh(1,1,n);
cout<< seg[1].okok <<"\n";
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |