Submission #972348

#TimeUsernameProblemLanguageResultExecution timeMemory
972348detroiddhSjeckanje (COCI21_sjeckanje)C++17
110 / 110
353 ms30140 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; const ll maxn = 2*1e5+3; const ll mod = 1e9 + 7; ll a[maxn] , d[maxn] , st[4 * maxn][2][2]; void construct(int si , int l , int r) { if(l == r) { st[si][0][0] = st[si][1][0] = st[si][0][1] = 0; st[si][1][1] = abs(d[l]); return; } int mid = (l + r) / 2; construct(si * 2 , l , mid); construct(si * 2 + 1 , mid + 1 , r); for(int l1 = 0 ; l1 < 2 ; ++l1) { for(int r1 = 0 ; r1 < 2 ; ++r1) { for(int l2 = 0 ; l2 < 2 ; ++l2) { for(int r2 = 0 ; r2 < 2 ; ++r2) { if(d[mid] * d[mid + 1] < 0 && (r1 & l2 == 1)) continue; st[si][l1][r2] = max(st[si][l1][r2] , st[si * 2][l1][r1] + st[si * 2 + 1][l2][r2]); } } } } } void update(int si , int l , int r , int pos) { if(l == r) { st[si][1][1] = abs(d[l]); return; } int mid = (l + r) / 2; if(pos <= mid) update(si * 2 , l , mid , pos); else update(si * 2 + 1 , mid + 1 , r , pos); for(int i = 0 ; i < 2 ; ++i) for(int j = 0 ; j < 2 ; ++j) st[si][i][j] = 0; for(int l1 = 0 ; l1 < 2 ; ++l1) { for(int r1 = 0 ; r1 < 2 ; ++r1) { for(int l2 = 0 ; l2 < 2 ; ++l2) { for(int r2 = 0 ; r2 < 2 ; ++r2) { if(d[mid] * d[mid + 1] < 0 && (r1 & l2 == 1)) continue; st[si][l1][r2] = max(st[si][l1][r2] , st[si * 2][l1][r1] + st[si * 2 + 1][l2][r2]); } } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //freopen("","r",stdin); //freopen("","w",stdout); int n , q; cin>>n>>q; for(int i = 1 ; i <= n ; ++i) cin>>a[i]; for(int i = 1 ; i < n ; ++i) d[i] = a[i + 1] - a[i]; construct(1 , 1 , n - 1); ll l , r , x; while(q--) { cin>>l>>r>>x; d[l - 1] += x; if(l > 1) update(1 , 1 , n - 1 , l - 1); d[r] -= x; update(1 , 1 , n - 1 , r); // if(q == 1) // for(int i = 1 ; i <= 4 * n ; ++i) // cout<<st[i][0][0]<<" "<<st[i][0][1]<<" "<<st[i][1][0]<<" "<<st[i][1][1]<<'\n'; cout<<max({st[1][0][0] , st[1][0][1] , st[1][1][0] , st[1][1][1]})<<'\n'; } }

Compilation message (stderr)

Main.cpp: In function 'void construct(int, int, int)':
Main.cpp:33:60: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
   33 |                     if(d[mid] * d[mid + 1] < 0 && (r1 & l2 == 1)) continue;
      |                                                         ~~~^~~~
Main.cpp: In function 'void update(int, int, int, int)':
Main.cpp:66:60: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
   66 |                     if(d[mid] * d[mid + 1] < 0 && (r1 & l2 == 1)) continue;
      |                                                         ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...