제출 #226647

#제출 시각아이디문제언어결과실행 시간메모리
226647dolphingarlic새로운 문제 (POI11_met)C++14
100 / 100
2021 ms61288 KiB
#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;

int n, m, l[300002], r[300002];
ll bit[300002], req[300002], num[300002];
pair<int, int> event[300002];
vector<int> owned[300002], to_check[300002];

void update(int pos, ll val) {
	for (; pos <= m; pos += (pos & (-pos))) bit[pos] += val;
}

ll query(int pos) {
	ll ans = 0;
	for (; pos; pos -= (pos & (-pos))) ans += bit[pos];
	return ans;
}

void update(pair<int, int> range, ll val) {
	if (range.first > range.second) update(1, val);
	update(range.first, val), update(range.second + 1, -val);
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	FOR(i, 1, m + 1) {
		int x;
		cin >> x;
		owned[x].push_back(i);
	}
	FOR(i, 1, n + 1) cin >> req[i];

	int k;
	cin >> k;
	FOR(i, 1, k + 1) cin >> event[i].first >> event[i].second >> num[i];

	FOR(i, 1, n + 1) l[i] = 1, r[i] = k + 1;
	bool done = false;
	while (!done) {
		done = true;

		fill(bit + 1, bit + m + 1, 0);
		FOR(i, 1, n + 1) if (l[i] != r[i]) to_check[(l[i] + r[i]) / 2].push_back(i);

		FOR(i, 1, k + 1) {
			update(event[i], num[i]);
			while (to_check[i].size()) {
				done = false;
				int nation = to_check[i].back();
				to_check[i].pop_back();

				ll tot = 0;
				for (int j : owned[nation]) {
					tot += query(j);
					if (tot >= req[nation]) break;
				}
				if (tot >= req[nation]) r[nation] = i;
				else l[nation] = i + 1;
			}
		}
	}

	FOR(i, 1, n + 1) {
		if (l[i] == k + 1) cout << "NIE\n";
		else cout << l[i] << '\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...