Submission #552714

#TimeUsernameProblemLanguageResultExecution timeMemory
552714dsyzSterilizing Spray (JOI15_sterilizing)C++17
100 / 100
279 ms16476 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define MAXN (100005) /* use "brute force" using point update for divide since the log2(10^9) <= 32 so it is small enough to divide individually, just stop going down when there is v = 0 in the divide function Also, if K == 1, then dont divide since it will all the way down as v would not be log() at all so would TLE * */ ll N,Q,K; struct node { ll s,e,m,v; node *l, *r; node(ll _s,ll _e){ s = _s; e = _e; m = (s + e) >> 1; v = 0; if(s != e){ l = new node(s,m); r = new node(m + 1,e); } } void update(ll x,ll newvalue){ if(s == e){ v = newvalue; }else{ if(x >= m + 1) r -> update(x,newvalue); else if(x <= m) l -> update(x,newvalue); v = l->v + r->v; } } void spray(ll x,ll y){ if(K == 1) return; if(s == e){ v /= K; }else if(s == x && e == y){ if(v == 0) return; l->spray(x,m); r->spray(m + 1,y); v = l->v + r->v; }else{ if(x >= m + 1) r -> spray(x,y); else if(y <= m) l -> spray(x,y); else l -> spray(x,m), r -> spray(m + 1,y); v = l->v + r->v; } } long long query(ll x,ll y){ if(s == x && e == y) return v; else{ if(x >= m + 1) return r -> query(x,y); else if(y <= m) return l -> query(x,y); else return l -> query(x,m) + r -> query(m + 1,y); } } } *root; int main() { ios_base::sync_with_stdio(false);cin.tie(0); cin>>N>>Q>>K; root = new node(0,N + 5); ll arr[N]; for(ll i = 0;i < N;i++){ cin>>arr[i]; root -> update(i,arr[i]); } for(ll i = 0;i < Q;i++){ ll s,t,u; cin>>s>>t>>u; if(s == 1){ t--; root -> update(t,u); }else if(s == 2){ t--; u--; root -> spray(t,u); }else if(s == 3){ t--; u--; cout<<root -> query(t,u)<<'\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...