Submission #650089

#TimeUsernameProblemLanguageResultExecution timeMemory
650089MEGalodonGrowing Trees (BOI11_grow)C++14
0 / 100
90 ms6044 KiB
#include <bits/stdc++.h> #define MAXN 100010 using namespace std; int height[MAXN]; class SegmentTree{ private: int n; vector<int> st, marked; int left(int p){ return 2*p; } int right(int p){ return 2*p+1; } void build(int p, int L, int R){ if( L == R ){ st[p] = height[L]; return; } int mid = (L+R)/2; build(left(p), L, mid); build(right(p), mid+1, R); st[p] = max(st[left(p)], st[right(p)]); //make sure this is right } void push(int p, int L, int R){ if( L == R ) return; int k = marked[p]; marked[left(p)] += k; marked[right(p)] += k; marked[p] = 0; st[left(p)] += k; st[right(p)] += k; } void update(int p, int L, int R, int i, int j){ if( i > R || j < L ) return; if( L >= i && R <= j ){ marked[p] += 1; st[p] += 1; return; } int mid = (L+R)/2; if( marked[p] ) push(p, L, R); update(left(p), L, mid, i, j); update(right(p), mid+1, R, i, j); st[p] = max(st[left(p)], st[right(p)]); } int query(int p, int L, int R, int h){ if( st[p] < h ) return 0; if( L == R ) return L; int mid = (L+R)/2; if( marked[p] ) push(p, L, R); if( st[left(p)] >= h ) return query(left(p), L, mid, h); return query(right(p), mid+1, R, h); } public: SegmentTree(int _n) : n(_n){ marked.assign(4*n, 0); st.resize(4*n); build(1, 1, n); } void update(int i, int j){ update(1, 1, n, i, j); } int query(int h){ return query(1, 1, n, h); } }; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int trees, queries; cin>>trees>>queries; for( int i{1} ; i <= trees ; ++i ) cin>>height[i]; sort(height+1, height+1+trees); height[trees+1] = INT_MAX; SegmentTree st(trees+1); while( queries-- ){ char type; cin>>type; if( type == 'F' ){ int c, h; cin>>c>>h; int p1 = st.query(h); int p2 = min(trees, p1+c-1); if( height[p2] < height[p2+1] ) st.update(p1, p2); else{ int p3 = st.query(height[p2])-1; int l = p3 - p1 + 1; c -= l; st.update(p1, p3); int p4 = st.query(height[p2]+1); p3 = p4-c; st.update(p3, p4-1); } } else{ int l, r; cin>>l>>r; int p1 = st.query(l); int p2 = st.query(r+1); cout<<p2-p1<<'\n'; } //any edge cases you are missing? } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...