Submission #318653

#TimeUsernameProblemLanguageResultExecution timeMemory
318653CaroLindaSterilizing Spray (JOI15_sterilizing)C++14
100 / 100
1117 ms372708 KiB
#include <bits/stdc++.h> #define sz(x) (int)(x.size() ) #define ll long long #define all(x) x.begin(),x.end() #define CTE 30 const int MAXN = 1e5+10 ; using namespace std ; struct Node { int qtdLazy ; long long sums[CTE] ; Node() { qtdLazy = 0 ; for(int i = 0 ; i < CTE ; i++ ) sums[i] = 0LL ; } } ; struct Seg { Node tree[MAXN*4] ; int m(int l, int r ) { return (l+r)>>1 ; } void refresh(int pos, int l, int r ) { if(tree[pos].qtdLazy == 0 ) return ; Node &ptr = tree[pos] ; for(int i = 0 ; i < CTE ; i++ ) { if( i + ptr.qtdLazy < CTE ) ptr.sums[i] = ptr.sums[ i+ptr.qtdLazy ] ; else ptr.sums[i] = 0 ; } if( l == r ) return (void)(ptr.qtdLazy = 0) ; tree[pos<<1].qtdLazy += ptr.qtdLazy ; tree[pos<<1|1].qtdLazy += ptr.qtdLazy ; ptr.qtdLazy = 0 ; } void merge(Node &v, Node &l, Node &r ) { for(int i = 0 ;i < CTE ; i++ ) v.sums[i] = l.sums[i] + r.sums[i] ; } //Don't forget to erase the value that was there before updating void upd(int pos, int l, int r, int k, vector<long long> toSum ) { refresh(pos,l,r) ; for(int i = 0 ; i < CTE ; i++ ) tree[pos].sums[i] += toSum[i] ; if( l == r ) return ; if( k <= m(l,r) ) upd(pos<<1 , l, m(l,r) , k , toSum ) ; else upd(pos<<1|1 , m(l,r)+1, r, k , toSum ) ; } void spray(int pos, int l, int r, int beg, int en ) { refresh(pos,l,r) ; if( l > en || r < beg ) return ; if( l >= beg && r <= en ) { tree[pos].qtdLazy++ ; refresh(pos,l,r) ; return ; } spray(pos<<1 , l ,m(l,r) , beg, en ) ; spray(pos<<1|1 , m(l,r)+1, r, beg, en ) ; merge( tree[pos], tree[pos<<1] , tree[pos<<1|1] ) ; } Node qry(int pos, int l, int r, int beg, int en ) { if( l > en || r <beg ) return *(new Node() ) ; refresh(pos,l,r ) ; if( l >= beg && r <= en ) return tree[pos] ; Node a = qry(pos<<1 ,l , m(l,r) , beg, en ) ; Node b = qry(pos<<1|1 , m(l,r)+1, r, beg, en ) ; Node v ; merge(v,a,b) ; return v ; } } seg ; int n , k , q ; long long miniBit[MAXN] ; void upd(int i, long long val ) { for(; i < MAXN ; i += i & -i ) miniBit[i] += val ; } long long qry(int i ) { long long tot = 0 ; for(; i > 0 ; i -= i &-i ) tot += miniBit[i] ; return tot ; } void solve1() { vector<long long> plate(n+1) ; for(int i = 1 ; i <= n ; i++ ) { scanf("%lld", &plate[i] ) ; upd(i, plate[i]) ; } for(int i = 1 , t ,l ,r ; i <= q ; i++ ) { scanf("%d%d%d", &t, &l, &r ) ; if(t == 1 ) { upd( l , -plate[l] + r ) ; plate[l] = r ; } else if( t == 3 ) printf("%lld\n", qry(r) - qry(l-1) ) ; } exit(0) ; } int main() { scanf("%d %d %d", &n, &q, &k ) ; if(k == 1 ) solve1() ; for(int i = 1 , c ; i <= n ; i++ ) { vector<long long> toSum(CTE); scanf("%lld", &toSum[0] ) ; for(int j = 1 ; j < CTE ; j++ ) toSum[j] = toSum[j-1]/k ; seg.upd(1,1,n, i, toSum ) ; } for(int i = 1 , t , l, r ; i <= q ; i++ ) { scanf("%d %d %d", &t, &l, &r ) ; Node ans ; if(t == 1 ) { ans = seg.qry(1,1,n, l , l ) ; vector<long long> toSum(CTE) ; toSum[0] = r ; for(int j = 1 ; j < CTE ; j++ ) toSum[j] = toSum[j-1]/k ; for(int j = 0 ; j < CTE ; j++ ) toSum[j] -= ans.sums[j] ; seg.upd(1,1,n, l , toSum ) ; } else if( t == 2 ) seg.spray(1,1,n, l, r ) ; else { ans = seg.qry(1,1,n, l, r ) ; printf("%lld\n", ans.sums[0] ) ; } } }

Compilation message (stderr)

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:156:18: warning: unused variable 'c' [-Wunused-variable]
  156 |  for(int i = 1 , c ; i <= n ; i++ )
      |                  ^
sterilizing.cpp: In function 'void solve1()':
sterilizing.cpp:130:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  130 |   scanf("%lld", &plate[i] ) ;
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:136:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  136 |   scanf("%d%d%d", &t, &l, &r ) ;
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp: In function 'int main()':
sterilizing.cpp:152:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  152 |  scanf("%d %d %d", &n, &q, &k ) ;
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:159:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  159 |   scanf("%lld", &toSum[0] ) ;
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:169:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  169 |   scanf("%d %d %d", &t, &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...