제출 #794912

#제출 시각아이디문제언어결과실행 시간메모리
794912RushB푸드 코트 (JOI21_foodcourt)C++17
68 / 100
1061 ms91860 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define int int64_t const int64_t INF = 1ll << 60; const int N = 3e5; const int LG = 20; int A[N], B[N], L[N], R[N], K[N], C[N], n, m, q, mn[N << 2], delta[N << 2], ans[N]; vector<int> V[4 * N], GET[N]; short t[N]; struct fenw { int bit[N]; void add(int r, int d) { r++; for (; r < N; r += r & -r) bit[r] += d; } int get(int r) { r++; int re = 0; for (; r; r &= (r - 1)) re += bit[r]; return re; } int find(int x) { int pos = 0; for (int i = LG; i >= 0; i--) { if (pos + (1 << i) < N && bit[pos + (1 << i)] < x) { pos += 1 << i; x -= bit[pos]; } } return pos; } } pos, all; void add_query(int v, int l, int r, int L, int R, int query_ind) { if (R <= l || r <= L) return; if (L <= l && r <= R) { V[v].push_back(query_ind); return; } int m = l + r >> 1; add_query(v << 1, l, m, L, R, query_ind); add_query(v << 1 | 1, m, r, L, R, query_ind); } void add(int v, int l, int r, int L, int R, int d) { if (L <= l && r <= R) { mn[v] += d; delta[v] += d; return; } int m = l + r >> 1; if (R <= m) add(v << 1, l, m, L, R, d); else if (L >= m) add(v << 1 | 1, m, r, L, R, d); else { add(v << 1, l, m, L, R, d); add(v << 1 | 1, m, r, L, R, d); } mn[v] = min(mn[v << 1], mn[v << 1 | 1]) + delta[v]; } int get(int v, int l, int r, int L, int R) { if (R <= l || r <= L) return INF; if (L <= l && r <= R) return mn[v]; int m = l + r >> 1; return min(get(v << 1, l, m, L, R), get(v << 1 | 1, m, r, L, R)) + delta[v]; } void solve(int v, int l, int r) { for (auto i: V[v]) { if (t[i] == 1) { pos.add(i, K[i]); all.add(i, K[i]); add(1, 0, q, i, q, K[i]); } else { all.add(i, -K[i]); add(1, 0, q, i, q, -K[i]); } } if (l + 1 == r) { for (auto i: GET[l]) { int all_pos = pos.get(i), mn = get(1, 0, q, 0, i + 1), sz = all.get(i) - (mn < 0 ? mn : 0), b = B[i]; b += all_pos - sz; ans[i] = (b <= all_pos ? pos.find(b) : N); } } else { int m = l + r >> 1; solve(v << 1, l, m); solve(v << 1 | 1, m, r); } for (auto i: V[v]) { if (t[i] == 1) { pos.add(i, -K[i]); all.add(i, -K[i]); add(1, 0, q, i, q, -K[i]); } else { all.add(i, +K[i]); add(1, 0, q, i, q, +K[i]); } } } signed main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> m >> q; FOR(i, 0, q) { cin >> t[i]; if (t[i] == 1) { cin >> L[i] >> R[i] >> C[i] >> K[i]; L[i]--; add_query(1, 0, n, L[i], R[i], i); R[i]--; } else if (t[i] == 2) { cin >> L[i] >> R[i] >> K[i]; L[i]--; add_query(1, 0, n, L[i], R[i], i); R[i]--; } else { cin >> A[i] >> B[i]; A[i]--; GET[A[i]].push_back(i); } } solve(1, 0, n); FOR(i, 0, q) if (t[i] == 3) cout << (ans[i] == N ? 0 : C[ans[i]]) << '\n'; } //06:22:05

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

foodcourt.cpp: In function 'void add_query(int64_t, int64_t, int64_t, int64_t, int64_t, int64_t)':
foodcourt.cpp:44:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   44 |         int m = l + r >> 1;
      |                 ~~^~~
foodcourt.cpp: In function 'void add(int64_t, int64_t, int64_t, int64_t, int64_t, int64_t)':
foodcourt.cpp:55:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |         int m = l + r >> 1;
      |                 ~~^~~
foodcourt.cpp: In function 'int64_t get(int64_t, int64_t, int64_t, int64_t, int64_t)':
foodcourt.cpp:69:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   69 |         int m = l + r >> 1;
      |                 ~~^~~
foodcourt.cpp: In function 'void solve(int64_t, int64_t, int64_t)':
foodcourt.cpp:93:27: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   93 |                 int m = l + r >> 1;
      |                         ~~^~~
#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...