Submission #831276

#TimeUsernameProblemLanguageResultExecution timeMemory
83127612345678Sjeckanje (COCI21_sjeckanje)C++17
110 / 110
505 ms36616 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int nx=2e5+5, sx=2, inf=1e9; int n, q, idx, df[nx], v[nx], l, r, x; struct segtree { struct mat:array<array<ll, sx>, sx> { mat() { for (int i=0; i<sx; i++) for (int j=0; j<sx; j++) (*this)[i][j]=-inf; } mat(int idx) { (*this)[1][1]=-inf; (*this)[0][1]=0; if ((df[idx]^df[idx-1])>=0) (*this)[0][0]=abs(df[idx]), (*this)[1][0]=-inf; else (*this)[0][0]=0, (*this)[1][0]=abs(df[idx]); } friend mat operator*(const mat A, const mat B) { mat res; for (int i=0; i<sx; i++) for (int j=0; j<sx; j++) for (int k=0; k<sx; k++) res[i][j]=max(A[i][k]+B[k][j], res[i][j]); return res; } } d[4*nx]; void build(int l, int r, int i) { if (l==r) return void(d[i]=mat(l)); int md=(l+r)/2; build(md+1, r, 2*i+1); build(l, md, 2*i); d[i]=d[2*i]*d[2*i+1]; } void update(int l, int r, int i, int idx) { if (idx<l||r<idx) return; if (l==r) return void(d[i]=mat(l)); int md=(l+r)/2; update(l, md, 2*i, idx); update(md+1, r, 2*i+1, idx); d[i]=d[2*i]*d[2*i+1]; } } s; int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>q; for (int i=1; i<=n; i++) cin>>v[i], df[i]=v[i]-v[i-1]; s.build(2, n, 1); while (q--) { cin>>l>>r>>x; df[l]+=x; df[r+1]-=x; s.update(2, n, 1, l); s.update(2, n, 1, l+1); s.update(2, n, 1, r+1); s.update(2, n, 1, r+2); cout<<max(s.d[1][0][0], s.d[1][1][0])<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...