Submission #954518

#TimeUsernameProblemLanguageResultExecution timeMemory
954518ezzzayGrowing Trees (BOI11_grow)C++14
100 / 100
216 ms5872 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define ff first #define ss second #define pb push_back const int N=2e5+5; int bit[N]; int arr[N]; int n,q; vector<int>ans; void update(int idx, int val){ if(idx==0)return; while(idx<N){ bit[idx]+=val; idx+= idx & -idx; } } int find(int idx){ if(idx==0)return 0; int s=0; while(idx>0){ s+=bit[idx]; idx-= idx & -idx; } return s; } int findpos(int h){ int lo=1; int hi=n+1; while(hi>=lo){ int mid=(hi+lo)/2; if(find(mid)+arr[mid]<h){ lo=mid+1; } else{ hi=mid-1; } } return lo; } signed main(){ vector<int>v; cin>>n>>q; for(int i=1;i<=n;i++){ int a; cin>>a; v.pb(a); } sort(v.begin(),v.end()); for(int i=1;i<=n;i++){ arr[i]=v[i-1]; } arr[n+1]=2e9; cout<<endl; while(q--){ char c; cin>>c; if(c=='F'){ int x,h; cin>>x>>h; int lo=findpos(h); if(n-lo+1<=x){ update(lo,1); continue; } int r= lo+x-1; int p=find(r)+arr[r]; int z=findpos(p); update(lo,1); update(z,-1); int cnt=r-z+1; int y=findpos(p+1)-1; int t=max(1LL,y-cnt+1); update(t,1); update(y+1,-1); } else{ int l,r ; cin>>l>>r; int y=findpos(r+1); int x=findpos(l); ans.pb(y-x); } } for(auto a:ans)cout<<a<<endl; }
#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...