Submission #538399

#TimeUsernameProblemLanguageResultExecution timeMemory
538399perchutsGrowing Trees (BOI11_grow)C++17
0 / 100
1089 ms3008 KiB
#include <bits/stdc++.h> #define maxn (int)(1e5+51) #define all(x) x.begin(), x.end() #define sz(x) (int) x.size() #define endl '\n' #define ll long long #define pb push_back #define ull unsigned long long #define ii pair<int,int> #define iii tuple<int,int,int> #define inf 2000000001 #define mod 1000000007 //998244353 #define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); using namespace std; template<typename X, typename Y> bool ckmin(X& x, const Y& y) { return (y < x) ? (x=y,1):0; } template<typename X, typename Y> bool ckmax(X& x, const Y& y) { return (x < y) ? (x=y,1):0; } int n,m,bit[maxn]; void insert(int x,int d){ while(x<=2*n)bit[x]+=d,x+=x&(-x); } void add(int l,int r,int d){ insert(l,d); insert(r+1,-d); } int query(int x){ int ans = 0; while(x){ ans += bit[x]; x -= x&(-x); } return ans; } int main(){_ cin>>n>>m; vector<int>v(n); for(auto& x:v)cin>>x; sort(all(v)); for(int i=0;i<n;++i)add(i+1,i+1,v[i]); for(int i=1;i<=n;++i)cerr<<query(i)<<" "; cerr<<endl; while(m--){ char op;cin>>op; if(op=='F'){ int c,h;cin>>c>>h; cerr<<"adding to "<<c<<" smallest elements starting from "<<h<<endl; int l = 1, r = n, ans = inf; //find lower bound for H while(l<=r) { int md = l + (r-l+1)/2; if(query(md)>=h)ans = md, r = md-1; else l = md + 1; } if(ans==inf)continue; int lo = ans, hi = min(n,ans + c - 1);//minelement >= h int biggest = query(hi);//maxheight of added element cerr<<"found "<<lo<<" as min index >=h"<<endl; cerr<<"biggest height to be added is "<<biggest<<endl; if(biggest!=query(lo)){ l = 1, r = n, ans = inf; while(l<=r){ int md = l + (r-l+1)/2; if(query(md)<biggest)ans = md, l = md + 1; else r = md - 1; }//ans = largest idx whose height is < biggest add(lo,ans,1);//added everyone in interval [query(lo),biggest-1] cerr<<"max index < biggest is"<<ans<<endl; }else ans = lo-1; int left = c - (ans-lo+1); //now add to rightmost biggest if(!left)continue; l = 1, r = n, ans = inf; while(l<=r){ int md = l + (r-l+1)/2; if(query(md)>biggest)ans = md, r = md - 1; else l = md + 1; } cerr<<"now, adding from "<<ans-left<<" to "<<ans-1<<endl; add(ans-left,ans-1,1); }else{ int le,ri;cin>>le>>ri; int l = 1, r = n, ans = inf; while(l<=r){ int md = l + (r-l+1)/2; if(query(md)>=le)ans = md, r = md - 1; else l = md + 1; } int lo = ans; l = 1, r = n, ans = inf; while(l<=r){ int md = l + (r-l+1)/2; if(query(md)<=ri)ans = md, l = md + 1; else r = md - 1; } int hi = ans; if(max(hi,lo)==inf){ cout<<0<<endl; } else cout<<hi-lo+1<<endl; } for(int i=1;i<=n;++i)cerr<<query(i)<<" "; cerr<<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...