제출 #797083

#제출 시각아이디문제언어결과실행 시간메모리
797083vjudge1Food Court (JOI21_foodcourt)C++17
100 / 100
369 ms53068 KiB
#include <bits/stdc++.h> #define fi first #define se second const int N = 250500; const int mod = 1e9 + 7; using namespace std; struct fenwick { vector<long long> t; fenwick(int _N) : t(_N, 0) {} void upd(int x, long long g) { while(x < t.size()) { t[x] += g; x += x & -x; } } long long get(int x) { long long res = 0; while(x > 0) { res += t[x]; x -= x & -x; } return res; } int get_f(long long k) { int res = 0; for (int i = 20; i >= 0; i--) { if (res + (1 << i) >= t.size()) { continue; } else if (t[res + (1 << i)] < k) { res += (1 << i); k -= t[res]; } } return res + 1; } }; long long t[4 * N]; long long lz[4 * N]; void upd(int x, int l, int r, int tl, int tr, long long y) { if (tl > tr) { return; } else if (l == tl && r == tr) { t[x] += y; lz[x] += y; return; } int m = (l + r) / 2; upd(x * 2, l, m, tl, min(m, tr), y); upd(x * 2 + 1, m + 1, r, max(m + 1, tl), tr, y); t[x] = min(t[x * 2], t[x * 2 + 1]) + lz[x]; } long long inf = 1e18; long long get(int x, int l, int r, int tl, int tr) { if (tl > tr) { return inf; } else if (l == tl && r == tr) { return t[x]; } int m = (l + r) / 2; return min(get(x * 2, l, m, tl, min(m, tr)), get(x * 2 + 1, m + 1, r, max(m + 1, tl), tr)) + lz[x]; } fenwick A(N), B(N); int n, m, q; long long res[N]; long long c[N]; vector<pair<long long, long long>> ad[N]; vector<pair<long long, long long>> del[N]; vector<pair<long long, long long>> qu[N]; int main() { #ifdef zxc freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios_base::sync_with_stdio(0); cin >> n >> m >> q; for (int i = 1; i <= q; i++) { int t; cin >> t; res[i] = -1; if (t == 1) { long long l, r, k; cin >> l >> r >> c[i] >> k; ad[l].push_back({i, k}); ad[r + 1].push_back({i, -k}); } else if (t == 2) { long long l, r, k; cin >> l >> r >> k; del[l].push_back({i, -k}); del[r + 1].push_back({i, k}); } else { long long l, b; cin >> l >> b; qu[l].push_back({i, b}); } } for (int i = 1; i <= n; i++) { for (auto p: ad[i]) { A.upd(p.fi, p.se); B.upd(p.fi, p.se); upd(1, 0, q, p.fi, q, p.se); } for (auto p: del[i]) { B.upd(p.fi, p.se); upd(1, 0, q, p.fi, q, p.se); } for (auto p: qu[i]) { long long all = A.get(p.fi); long long cur = B.get(p.fi) - get(1, 0, q, 0, p.fi); p.se += all - cur; if (p.se <= all) { res[p.fi] = c[A.get_f(p.se)]; } else { res[p.fi] = 0; } } } for (int i = 1; i <= q; i++) { if (res[i] != -1) { cout << res[i] << "\n"; } } }

컴파일 시 표준 에러 (stderr) 메시지

foodcourt.cpp: In member function 'void fenwick::upd(int, long long int)':
foodcourt.cpp:16:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |                 while(x < t.size()) {
      |                       ~~^~~~~~~~~~
foodcourt.cpp: In member function 'int fenwick::get_f(long long int)':
foodcourt.cpp:34:44: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |                         if (res + (1 << i) >= t.size()) {
      |                             ~~~~~~~~~~~~~~~^~~~~~~~~~~
#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...