Submission #991333

#TimeUsernameProblemLanguageResultExecution timeMemory
991333goats_9Growing Trees (BOI11_grow)C++17
100 / 100
91 ms3680 KiB
/* Author: goats_9 */

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define LSOne(s) (s & -(s))

class BIT {
	int n;
	vector<ll> values;

public:
	BIT(int _n) : n(_n), values(n + 1, 0LL) {}

	void update(int l, int r, int v) {
		if (r <= l) return;
		for (; l <= n; l += LSOne(l)) values[l] += v;
		for (; r <= n; r += LSOne(r)) values[r] -= v;
	}

	ll query(int i) {
		if (i > n) return -1;
		ll ret = 0;
		for (; i; i -= LSOne(i)) ret += values[i];
		return ret;
	}
};

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, q;
	cin >> n >> q;
	vector<int> a(n);
	for (int i = 0; i < n; i++) cin >> a[i];
	sort(a.begin(), a.end());
	BIT ft(n);
	for (int i = 0; i < n; i++) ft.update(i + 1, i + 2, a[i]);
	while (q--) {
		char op;
		cin >> op;
		if (op == 'F') {
			int c, h;
			cin >> c >> h;
			int l = 0, r = n + 1;
			while (r - l > 1) {
				int g = (l + r) / 2;
				if (ft.query(g) >= h) r = g;
				else l = g;
			}
			if (r > n) continue;
			if (r + c > n) {
				ft.update(r, r + c, 1);
				continue;
			}
			int u = ft.query(r + c - 1);
			int lt = r;
			l = 0, r = n + 1;
			while (r - l > 1) {
				int g = (l + r) / 2;
				if (ft.query(g) >= u) r = g;
				else l = g;
			}
			int l1 = r;
			l = 0, r = n + 1;
			while (r - l > 1) {
				int g = (l + r) / 2;
				if (ft.query(g) <= u) l = g;
				else r = g;
			}
			ft.update(lt, l1, 1);
			ft.update(r - c + (l1 - lt), r, 1);
		} else {
			int m, M;
			cin >> m >> M;
			int l = 0, r = n + 1;
			while (r - l > 1) {
				int g = (l + r) / 2;
				if (ft.query(g) >= m) r = g;
				else l = g;
			}
			int lt = l;
			l = 0, r = n + 1;
			while (r - l > 1) {
				int g = (l + r) / 2;
				if (ft.query(g) > M) r = g;
				else l = g;
			}
			cout << l - lt << '\n';
		}
	}
	return 0;
}
#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...