Submission #100949

#TimeUsernameProblemLanguageResultExecution timeMemory
100949shafinalamGrowing Trees (BOI11_grow)C++14
0 / 100
1044 ms3364 KiB
#include <bits/stdc++.h> using namespace std; const int mx = 1e5+5; typedef long long ll; #define sf scanf #define pf printf int tree[mx<<2]; int lazy[mx<<2]; int arr[mx]; int n, m; void push(int node, int b,int e) { if(lazy[node]) { int left = node<<1; int right = left|1; tree[node]+=((e-b+1)*lazy[node]); if(b!=e) { lazy[left]+=lazy[node]; lazy[right]+=lazy[node]; } lazy[node] = 0; } return; } void update(int node, int b, int e, int l, int r) { push(node, b, e); if(b>r || e<l) return; if(b>=l && e<=r) { lazy[node]++; push(node, b, e); return; } int mid = (b+e)>>1; int left = node<<1; int right = left|1; update(left, b, mid, l, r); update(right, mid+1, e, l, r); tree[node] = tree[left]+tree[right]; } int query(int node, int b, int e, int pos) { push(node, b, e); if(b>pos || e<pos) return 0; if(b>=pos && e<=pos) return tree[node]; int mid = (b+e)>>1; int left = node<<1; int right = left|1; return query(left, b, mid, pos)+query(right, mid+1, e, pos); } int get(int pos) { return query(1, 1, n, pos); } int main() { sf("%d%d", &n, &m); for(int i = 1; i <= n; i++) sf("%d", &arr[i]); sort(arr+1, arr+n+1); while(m--) { char type; cin >> type; if(type=='F') { int h, c; sf("%d%d", &c, &h); int lo = 1, hi = n, pos = -1; while(lo<=hi) { int mid = (lo+hi)>>1; if(arr[mid]+get(mid)>=h) { pos = mid; hi = mid-1; } else lo = mid+1; } if(pos==-1) continue; int last = pos+c-1; last = min(last, n); if(last==n || arr[last]+get(last)!=arr[last+1]+get(last+1)) update(1, 1, n, pos, last); else { int l = 0, r = n+1, val = arr[last]+get(last); lo = 1, hi = n; while(lo<=hi) { int mid = (lo+hi)>>1; if(arr[mid]+get(mid)<val) { lo = mid+1; l = mid; } else hi = mid-1; } lo = 1, hi = n; while(lo<=hi) { int mid = (lo+hi)>>1; if(arr[mid]+get(mid)>val) { r = mid; hi = mid-1; } else lo = mid+1; } l++; r--; int len = last-l+1; update(1, 1, n, pos, l-1); update(1, 1, n, r-len+1, r); } //for(int i = 1; i <= n; i++) pf("%lld ", arr[i]+get(i)); //cout << '\n'; } else { int a, b; sf("%d%d", &a, &b); int l = -1, r = -1, lo = 1, hi = n; while(lo<=hi) { int mid = (lo+hi)>>1; if(arr[mid]+get(mid)>=a) { l = mid; hi = mid-1; } else lo = mid+1; } if(l==-1) { pf("0\n"); continue; } lo = 1, hi = n; while(lo<=hi) { int mid = (lo+hi)>>1; if(arr[mid]+get(mid)<=b) { r = mid; lo = mid+1; } else hi = mid-1; } pf("%d\n", r-l+1); } } return 0; }

Compilation message (stderr)

grow.cpp: In function 'int main()':
grow.cpp:65:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     sf("%d%d", &n, &m);
       ^
grow.cpp:67:35: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(int i = 1; i <= n; i++) sf("%d", &arr[i]);
                                   ^
grow.cpp:78:15: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             sf("%d%d", &c, &h);
               ^
grow.cpp:134:15: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             sf("%d%d", &a, &b);
               ^
#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...