Submission #359357

#TimeUsernameProblemLanguageResultExecution timeMemory
359357mjhmjh1104Meteors (POI11_met)C++17
100 / 100
2182 ms41680 KiB
#include <cstdio> #include <vector> #include <algorithm> using namespace std; long long tree[300006]; long long query(int x) { x++; long long ret = 0; while (x > 0) { ret += tree[x]; x -= x & -x; } return ret; } void update_fenwick(int x, long long v) { x++; while (x < 300006) { tree[x] += v; x += x & -x; } } void update(int l, int r, long long v) { update_fenwick(l, v); update_fenwick(r + 1, -v); } struct Query { int q; long long l; long long r; long long m; }; int n, m, q; long long p[300006]; vector<pair<pair<int, int>, long long>> updates; vector<Query> queries; vector<int> o[300006]; int main() { scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { int t; scanf("%d", &t); o[t - 1].push_back(i); } for (int i = 0; i < n; i++) scanf("%lld", p + i); scanf("%d", &q); for (int i = 0; i < q; i++) { int a, b; long long x; scanf("%d%d%lld", &a, &b, &x); a--, b--; updates.push_back({ { a, b }, x }); } for (int i = 0; i < n; i++) queries.push_back(Query{ i, 0, 300002, 150000 }); for (int t = 0; t < 20; t++) { sort(queries.begin(), queries.end(), [](const Query &a, const Query &b) { return a.m < b.m; }); fill(tree, tree + 300006, 0); int k = 0; for (int i = 0; i < q; i++) { while (k < n && i > queries[k].m) { long long sum = 0; for (auto &j: o[queries[k].q]) { sum += query(j); if (sum >= p[queries[k].q]) break; } if (sum >= p[queries[k].q]) queries[k].r = queries[k].m; else queries[k].l = queries[k].m + 1; queries[k].m = (queries[k].l + queries[k].r) / 2; k++; } if (updates[i].first.first <= updates[i].first.second) update(updates[i].first.first, updates[i].first.second, updates[i].second); else update(updates[i].first.first, m - 1, updates[i].second), update(0, updates[i].first.second, updates[i].second); } for (; k < n; k++) { long long sum = 0; for (auto &j: o[queries[k].q]) { sum += query(j); if (sum >= p[queries[k].q]) break; } if (sum >= p[queries[k].q]) queries[k].r = queries[k].m; else queries[k].l = queries[k].m + 1; queries[k].m = (queries[k].l + queries[k].r) / 2; } } sort(queries.begin(), queries.end(), [](const Query &a, const Query &b) { return a.q < b.q; }); for (auto &i: queries) { if (i.l > 300000) puts("NIE"); else printf("%lld\n", i.l + 1); } }

Compilation message (stderr)

met.cpp: In function 'int main()':
met.cpp:45:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   45 |     scanf("%d%d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~
met.cpp:48:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   48 |         scanf("%d", &t);
      |         ~~~~~^~~~~~~~~~
met.cpp:51:38: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   51 |     for (int i = 0; i < n; i++) scanf("%lld", p + i);
      |                                 ~~~~~^~~~~~~~~~~~~~~
met.cpp:52:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   52 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
met.cpp:56:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   56 |         scanf("%d%d%lld", &a, &b, &x);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...