Submission #447247

#TimeUsernameProblemLanguageResultExecution timeMemory
447247zaneyuGrowing Trees (BOI11_grow)C++14
100 / 100
862 ms7320 KiB
/*input 5 9 1 3 2 5 2 F 2 1 F 3 2 C 3 6 C 2 9 F 2 3 C 6 8 F 2 1 F 2 2 C 3 5 */ #include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag, tree_order_statistics_node_update> indexed_set; #define REP(i,n) for(int i=0;i<n;i++) #define pii pair<int,int> #define f first #define s second const int maxn=2e5+5; #define pb push_back #define ALL(x) x.begin(),x.end() #define sz(x) (int)x.size() #define ll long long pair<pii,int> query[maxn]; int ans[maxn],arr[maxn]; struct segt{ ll seg[4*maxn],lazy[4*maxn]; int n; void resize(int _n){ n=_n; } void pushdown(int idx,int l,int r){ if(!lazy[idx]) return; seg[idx]+=(r-l+1)*lazy[idx]; if(l==r){ lazy[idx]=0; return; } lazy[idx*2]+=lazy[idx]; lazy[idx*2+1]+=lazy[idx]; lazy[idx]=0; } void mdf(int idx,int l,int r,int ql,int qr,int x){ pushdown(idx,l,r); if(l>qr or r<ql) return; if(ql<=l and r<=qr){ lazy[idx]+=x; pushdown(idx,l,r); return; } int mid=(l+r)/2; mdf(idx*2,l,mid,ql,qr,x); mdf(idx*2+1,mid+1,r,ql,qr,x); seg[idx]=seg[idx*2]+seg[idx*2+1]; } ll query(int idx,int l,int r,int ql,int qr){ if(l>qr or r<ql) return 0; pushdown(idx,l,r); if(ql<=l and r<=qr) return seg[idx]; int mid=(l+r)/2; return query(idx*2,l,mid,ql,qr)+query(idx*2+1,mid+1,r,ql,qr); } ll query(int l,int r){ return query(1,0,n-1,l,r); } void mdf(int l,int r,int x){ if(l<0) l=0; mdf(1,0,n-1,l,r,x); } int lb(int x){ int l=0,r=n-1; while(l<r){ int mid=(l+r)/2; if(query(mid,mid)>=x) r=mid; else l=mid+1; } if(query(l,l)<x) return n; return l; } int ub(int x){ int l=0,r=n-1; while(l<r){ int mid=(l+r)/2; if(query(mid,mid)>x) r=mid; else l=mid+1; } if(query(l,l)<=x) return n; return l; } }seg; int main(){ ios::sync_with_stdio(false),cin.tie(0); int n,q; cin>>n>>q; vector<int> v; REP(i,n){ int x; cin>>x; v.pb(x); } sort(ALL(v)); seg.resize(n); REP(i,n) seg.mdf(i,i,v[i]); //cout<<seg.ub(1); while(q--){ char x; int a,b; cin>>x>>a>>b; if(x=='F'){ int i=seg.lb(b); if(i==n) continue; if(i+a>=n){ seg.mdf(i,n-1,1); continue; } int z=seg.query(min(i+a-1,n-1),min(i+a-1,n-1)); int l=seg.lb(z),r=seg.ub(z)-1; int cnt=a-(l-i); seg.mdf(r-cnt+1,r,1); seg.mdf(i,l-1,1); //REP(i,n) cout<<seg.query(i,i)<<' '; //cout<<'\n'; } else{ cout<<seg.ub(b)-seg.lb(a)<<'\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...
#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...