Submission #725435

#TimeUsernameProblemLanguageResultExecution timeMemory
725435smirichtoGrowing Trees (BOI11_grow)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; const long long N = 2e5 + 5 ; #define ll long long #define endl '\n' struct segmentTree { int n; vector<ll> sum, lz, sumB; init(int _n, int b[]) { n = _n; sum.assign(4 * n + 6, 0); lz.assign(4 * n + 6, 0); sumB.assign(4 * n + 6, 0); build(b, 1, 1, n); } void build(int b[], int i, int l, int r) { if (l == r) { sumB[i] = b[l]; return; } int m = (l + r) >> 1; build(b, i << 1, l, m); build(b, i << 1 | 1, m + 1, r); sumB[i] = sumB[i << 1] + sumB[i << 1 | 1]; } void pushdown(int i) { for(int j=i<<1; j<=(i<<1|1); ++j) { sum[j] += lz[i] * sumB[j]; lz[j] += lz[i]; } lz[i] = 0; } void upd(int i, int l, int r, int u, int v, ll delta) { if (l > r || u > v || l > v || r < u) return; if (l >= u && r <= v) { sum[i] += delta * sumB[i]; lz[i] += delta; return; } pushdown(i); int m = (l + r) >> 1; upd(i << 1, l, m, u, v, delta); upd(i << 1 | 1, m + 1, r, u, v, delta); sum[i] = sum[i << 1] + sum[i << 1 | 1]; } void upd(int u, int v, ll delta) { upd(1, 1, n, u, v, delta); } ll get(int i, int l, int r, int u, int v) { if (l > r || u > v || l > v || r < u) return 0; if (l >= u && r <= v) return sum[i]; pushdown(i); int m = (l + r) >> 1; return get(i << 1, l, m, u, v) + get(i << 1 | 1, m + 1, r, u, v); } ll get(int u, int v) { return get(1, 1, n, u, v); } }; int a[N] , b[N] ; segmentTree st ; int n , q ; int getlast(int x) { int l = 1 , r = n , p = 0 ; while(l<=r){ int md = (l+r)/2 ; int y = st.get(md , md) ; if(y<=x){ p = md ; l = md+1 ; } else r = md-1 ; } return p ; } int getfirst(int x) { int l = 1 , r = n , p = n+1 ; while(l<=r){ int md = (l+r)/2 ; int y = st.get(md , md) ; if(y>=x){ p = md ; r = md-1 ; } else l = md+1 ; } return p ; } int main() { ios::sync_with_stdio(0), cin.tie(0),cout.tie(0) ; cin>>n>>q ; for(int i = 1 ; i<=n ; i++){ cin>>a[i] ; b[i] = 1 ; } st.init(n , b) ; sort(a+1 , a+n+1) ; for(int i = 1 ; i<=n ; i++){ st.upd(i , i ,a[i]) ; } for(int i = 1 ; i<=n ; i++){ cout<<st.get(i , i)<<' '; } cout<<endl; while(q--){ char c ; cin>>c ; if(c=='F'){ int c , h ; cin>>c>>h ; int l = getfirst(h) ; int r = min(n , l+c-1) ; int x = st.get(r , r) ; int lr = getlast(x-1) ; int rr = getlast(x) ; int lefties = max(0 , lr - l+1) ; int rl = (rr - (c - lefties) +1) ; // upd [l , lr] , upd[rl , rr] if(l<=lr){ st.upd(l , lr , 1) ; } if(rl<=rr){ st.upd(rl , rr , 1) ; } } else{ int a , b ; cin>>a>>b ; cout<<getlast(b) - getfirst(a)+1<<endl; } } }

Compilation message (stderr)

grow.cpp:13:5: error: ISO C++ forbids declaration of 'init' with no type [-fpermissive]
   13 |     init(int _n, int b[]) {
      |     ^~~~
grow.cpp: In member function 'int segmentTree::init(int, int*)':
grow.cpp:19:5: warning: no return statement in function returning non-void [-Wreturn-type]
   19 |     }
      |     ^