제출 #447824

#제출 시각아이디문제언어결과실행 시간메모리
447824JasiekstrzSjeckanje (COCI21_sjeckanje)C++17
110 / 110
1004 ms50076 KiB
#include<bits/stdc++.h> #define fi first #define se second using namespace std; const int N=2e5; const int PP=3e5; const int INF=1e9+7; struct Dc { long long t[3][3]; // -,0,+ long long* operator[](int x) { return t[x]; } void operator+=(long long c) { for(int i=0;i<3;i++) { t[0][i]-=c; t[i][0]-=c; t[2][i]+=c; t[i][2]+=c; } return; } void init(int c) { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) t[i][j]=-INF; } t[0][1]=t[1][0]=-c; t[1][1]=0; t[2][1]=t[1][2]=c; return; } }; Dc operator+(Dc &a,Dc &b) { Dc ans; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { ans[i][j]=max(a[i][j],b[i][j]); for(int k=0;k<3;k++) ans[i][j]=max(ans[i][j],a[i][k]+b[3-k-1][j]); } } return ans; } int pot; Dc tree[2*PP+10]; long long lazy[2*PP+10]; void propagate(int i) { if(lazy[i]==0) return; tree[2*i]+=lazy[i]; tree[2*i+1]+=lazy[i]; lazy[2*i]+=lazy[i]; lazy[2*i+1]+=lazy[i]; lazy[i]=0; return; } void add(int i,int l,int r,int ls,int rs,long long c) { if(r<ls || rs<l) return; if(ls<=l && r<=rs) { tree[i]+=c; lazy[i]+=c; return; } propagate(i); int mid=(l+r)/2; add(2*i,l,mid,ls,rs,c); add(2*i+1,mid+1,r,ls,rs,c); tree[i]=tree[2*i]+tree[2*i+1]; return; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n,q; cin>>n>>q; for(pot=1;pot<n;pot*=2); for(int i=1;i<=n;i++) { int x; cin>>x; tree[pot+i-1].init(x); } for(int i=pot+n;i<2*pot;i++) tree[i]=tree[i-1]; for(int i=pot-1;i>=1;i--) tree[i]=tree[2*i]+tree[2*i+1]; while(q--) { int l,r,c; cin>>l>>r>>c; if(r==n) r=pot; add(1,1,pot,l,r,c); cout<<tree[1][1][1]<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...