Submission #1027143

#TimeUsernameProblemLanguageResultExecution timeMemory
1027143a5a7Growing Trees (BOI11_grow)C++14
10 / 100
507 ms7356 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using indexedset = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long ll; typedef long double ld; struct Node{ ll value = 0; ll add = 0; Node() {}; }; vector<Node> arr; int length, arrl; void build(int n){ arr.clear(); int powerOf2 = 1; while (powerOf2 < n) powerOf2 *= 2; n = powerOf2; length = 2 * n - 1, arrl = n; for (int i = 0; i < length; i++) arr.push_back(Node()); } void setval(int i, ll val){ int child = length-arrl+i; arr[child].value = val; while (child != 0){ if (child%2 == 0) child--; arr[(child-1)/2].value = arr[child].value + arr[child+1].value; child = (child-1)/2; } } void add(int left, int right, int start, int end, int node, ll ad){ if (left > end || right < start) return; if (left <= start && end <= right){ arr[node].add += ad; return; } int mid = (start+end)/2; arr[node].value += ll(min(end, right) - max(start, left) + 1) * ad; add(left, right, start, mid, node*2+1, ad); add(left, right, mid+1, end, node*2+2, ad); } ll range(int left, int right, int start, int end, int node){ if (left > end || right < start) return 0; if (left <= start && end <= right) return arr[node].value + arr[node].add * ll(end-start+1); int mid = (start+end)/2; arr[node].value += arr[node].add * ll(end-start+1); if ((node*2+2) < length){ arr[node*2+1].add += arr[node].add; arr[node*2+2].add += arr[node].add; } arr[node].add = 0; return range(left, right, start, mid, node*2+1) + range(left, right, mid+1, end, node*2+2); } int main(){ ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; int a[n]; build(n); for (int i = 0; i < n; i++) cin >> a[i]; sort(a, a+n); for (int i = 0; i < n; i++) setval(i, a[i]); function<int(int)> early = [&](int x){ int left = 0, right = n; while (left < right){ int mid = (left+right)/2; if (range(mid, mid, 0, arrl-1, 0) >= x){ right = mid; }else{ left = mid + 1; } } return left; }; function<int(int)> later = [&](int x){ int left = 0, right = n-1; while (left < right){ int mid = (left+right+1)/2; if (range(mid, mid, 0, arrl-1, 0) <= x){ left = mid; }else{ right = mid-1; } } return left; }; for (int i = 0; i < m; i++){ char c; int u, v; cin >> c >> u >> v; if (c == 'C'){ cout << (later(v)-early(u)+1) << endl; }else{ int index = early(v); if (index == n) continue; if ((index+u) >= n){ add(index, index+u-1, 0, arrl-1, 0, 1ll); }else{ int val = range(index+u-1, index+u-1, 0, arrl-1, 0); int ear = early(val); int lat = later(val); int taken = u-(ear-index); add(index, ear-1, 0, arrl-1, 0, 1ll); add(lat-taken+1, lat, 0, arrl-1, 0, 1ll); } } } }
#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...