Submission #776994

#TimeUsernameProblemLanguageResultExecution timeMemory
776994borisAngelovMeteors (POI11_met)C++17
100 / 100
1029 ms65536 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 300005; int n, m, q; long long required_sum[maxn]; struct element { int l; int r; long long x; }; element queries[maxn]; int answer[maxn]; vector<int> positions[maxn]; long long preffix[maxn]; long long tree[maxn]; vector<int> to_clear; void update(int pos, long long val) { for (int i = pos; i <= m; i += (i & (-i))) { tree[i] += val; to_clear.push_back(i); } } long long query(int pos) { long long result = 0; for (int i = pos; i >= 1; i -= (i & (-i))) { result += tree[i]; } return result; } void increase(int l, int r, long long delta) { if (l <= r) { //preffix[l] += delta; //preffix[r + 1] -= delta; update(l, +delta); update(r + 1, -delta); } else { //preffix[1] += delta; //preffix[r + 1] -= delta; //preffix[l] += delta; update(1, +delta); update(r + 1, -delta); update(l, +delta); } } void divide(int l, int r, vector<int>& active) { if (l > r) { return; } int mid = (l + r) / 2; for (int i = l; i <= mid; ++i) { increase(queries[i].l, queries[i].r, queries[i].x); } vector<int> left_active; vector<int> right_active; for (int i = 0; i < active.size(); ++i) { int id = active[i]; long long curr_sum = 0; for (auto pos : positions[id]) { curr_sum += query(pos); if (curr_sum >= required_sum[id]) { break; } } if (curr_sum >= required_sum[id]) { answer[id] = mid; left_active.push_back(id); } else { required_sum[id] -= curr_sum; right_active.push_back(id); } } for (auto pos : to_clear) { tree[pos] = 0LL; } to_clear.clear(); divide(l, mid - 1, left_active); divide(mid + 1, r, right_active); } void fastIO() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } int main() { fastIO(); cin >> n >> m; for (int i = 1; i <= m; ++i) { int id; cin >> id; positions[id].push_back(i); } vector<int> active; for (int i = 1; i <= n; ++i) { cin >> required_sum[i]; answer[i] = -1; active.push_back(i); } cin >> q; for (int i = 1; i <= q; ++i) { cin >> queries[i].l >> queries[i].r >> queries[i].x; } divide(1, q, active); for (int i = 1; i <= n; ++i) { if (answer[i] == -1) { cout << "NIE\n"; } else { cout << answer[i] << "\n"; } } return 0; }

Compilation message (stderr)

met.cpp: In function 'void divide(int, int, std::vector<int>&)':
met.cpp:90:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |     for (int i = 0; i < active.size(); ++i)
      |                     ~~^~~~~~~~~~~~~~~
#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...