제출 #1318892

#제출 시각아이디문제언어결과실행 시간메모리
1318892SofiatpcSjeckanje (COCI21_sjeckanje)C++20
110 / 110
434 ms64688 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...