Submission #100948

#TimeUsernameProblemLanguageResultExecution timeMemory
100948shafinalamGrowing Trees (BOI11_grow)C++14
10 / 100
724 ms4408 KiB
#include <bits/stdc++.h> using namespace std; const int mx = 1e5+5; typedef long long ll; typedef unsigned int ui; typedef unsigned long long ull; typedef pair<int,int>pii; typedef pair<int,pii>piii; #define sf scanf #define pf printf #define input freopen("input.txt","r",stdin) #define output freopen("output.txt","w",stdout) #define inf 1e16 #define ff first #define ss second #define MP make_pair #define pb push_back #define all(v) v.begin(), v.end() #define printcase(cases) printf("Case %d:", cases); #define Unique(a) a.erase(unique(a.begin(),a.end()),a.end()) #define FAST ios_base::sync_with_stdio(0);cout.tie(0) #define endl printf("\n") #define __lcm(a, b) ((a*b)/__gcd(a, b)) int Set(int N,int pos) { return N=N | (1<<pos); } int reset(int N,int pos) { return N= N & ~(1<<pos); } bool check(int N,int pos) { return (bool)(N & (1<<pos)); } 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==e && pos==b) return tree[node]; int mid = (b+e)>>1; int left = node<<1; int right = left|1; if(pos<=mid) return query(left, b, mid, pos); return 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') { ll 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:113:30: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'll* {aka long long int*}' [-Wformat=]
             sf("%d%d", &c, &h);
                        ~~    ^
grow.cpp:113:30: warning: format '%d' expects argument of type 'int*', but argument 3 has type 'll* {aka long long int*}' [-Wformat=]
grow.cpp:100: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:102: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:113: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:169: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...