Submission #310080

#TimeUsernameProblemLanguageResultExecution timeMemory
310080mohamedsobhi777Sterilizing Spray (JOI15_sterilizing)C++14
100 / 100
298 ms8216 KiB
#include<bits/stdc++.h> #pragma GCC optimize("-Ofast") //#pragma GCC optimize("trapv") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.2,popcnt,abm,mmx,avx2,tune=native") #pragma GCC optimize("-ffast-math") #pragma GCC optimize("-funroll-loops") #define I inline void #define S struct #define vi vector<int> #define vii vector<pair<int,int>> #define pii pair<int,int> #define pll pair<ll,ll> using namespace std ; using ll = long long ; using ld = long double ; const int N = 2e5 + 7 , mod = 1e9 + 7 ; const ll inf = 2e18 ; // How interesting! int n, m , k ; ll tree[N * 4] ; void update(int node, int L , int R , int ix , int v){ if(L == R){ tree[node] = v ; return ; } int mid = (L + R) >> 1; if(ix <= mid) update(node*2+1 , L , mid , ix ,v) ; else update(node*2+2, mid + 1 , R , ix , v) ; tree[node] = tree[node*2+1] + tree[node*2+2] ; } void spray(int node , int L, int R , int l , int r){ if(l > R || r < L) return ; if(L == R){ tree[node]/=k ; return ; } if(L >= l && R <= r && tree[node] == 0){ return ; } int mid = (L + R) >> 1; spray(node * 2 + 1, L , mid, l , r) ; spray(node * 2 + 2, mid + 1 , R , l , r) ; tree[node] = tree[node*2+1] + tree[node*2+2] ; } ll query(int node, int L , int R , int l , int r){ if(l > r || l > R || r < L) return 0 ; if(L>= l && R <= r) return tree[node] ; int mid = (L + R) >> 1 ; ll s1 = query(node*2+1, L , mid , l , r) ; ll s2 = query(node*2+2 , mid+1 , R , l , r) ; return s1 + s2 ; } int d1[N], d2[N], d3[N] ; ll bit[N], a[N]; inline void add(int ix, ll val){for(;ix<N;ix+=ix&-ix)bit[ix]+=val ; } ll upto(int ix){ ll ret = 0 ; for(;ix;ix-=ix&-ix)ret+=bit[ix] ; return ret; } inline ll get(int l, int r){return upto(r) - upto(l - 1) ; } void solve1(){ for(int i = 0 ;i < m; ++ i){ if(d1[i] == 1){ add(d2[i] , d3[i] - a[d2[i]]) ; a[d2[i]] = d3[i] ; }else if(d1[i] == 3){ cout<< get(d2[i] , d3[i]) <<"\n" ; } } } int main(){ ios_base::sync_with_stdio(0) ; cin.tie(0) ; //freopen("in.in" , "r" , stdin) ; cin >> n >> m >> k ; for(int i= 1; i <= n; ++ i){ int x ; cin >> x ; add(i , x) ; a[i] = x; update(0 , 1, N , i , x) ; } for(int i = 0 ; i< m ; ++ i){ cin >> d1[i] >> d2[i] >> d3[i] ; } if(k == 1){ solve1() ; return 0; } for(int i = 0 ;i < m ; ++ i){ int t = d1[i], l = d2[i] , r = d3[i] ; if(t == 1){ update(0 , 1, N, l , r) ; }else if(t == 2){ if(k > 1) ; spray(0 , 1 , N , l , r) ; }else{ cout<< query(0 ,1 , N, l , r) <<"\n" ; } } return 0 ; } /* - bounds sir (segtree = 4N, eulerTour = 2N, ...) - a variable defined twice? - will overflow? - is it a good complexity? - don't mess up indices (0-indexed vs 1-indexed) - reset everything between testcases. */

Compilation message (stderr)

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:118:25: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  118 |                         if(k > 1) ;
      |                         ^~
sterilizing.cpp:119:33: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  119 |                                 spray(0 , 1 , N , l , r) ;
      |                                 ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...