Submission #540556

#TimeUsernameProblemLanguageResultExecution timeMemory
540556LittleCubeFood Court (JOI21_foodcourt)C++14
100 / 100
496 ms41220 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define F first #define S second using namespace std; ll N, M, Q, t2[1000005], neg[1000005], pos[1000005], seg[1000005], lazy[1000005], ans[250005], color[250005]; vector<pair<int, pair<int, pll>>> modifies, colors; vector<pair<int, pll>> queries; void push(int i, ll val) { if (val > 0) pos[i] += val; else if (val < 0) { if (pos[i] + val > 0) pos[i] += val; else { neg[i] += pos[i] + val; pos[i] = 0; } } } void t12(int mL, int mR, ll val, int i = 1, int L = 1, int R = N) { if (mL <= L && R <= mR) { if (val < 0) t2[i] += val; push(i, val); } else if (R < mL || mR < L) return; else { int mid = (L + R) / 2; push(i * 2, neg[i]); push(i * 2 + 1, neg[i]); push(i * 2, pos[i]); push(i * 2 + 1, pos[i]); pos[i] = neg[i] = 0; t12(mL, mR, val, i * 2, L, mid); t12(mL, mR, val, i * 2 + 1, mid + 1, R); } } pll query(int p, int i = 1, int L = 1, int R = N) { if (L == R) return {neg[i], pos[i]}; else { int mid = (L + R) / 2; push(i * 2, neg[i]); push(i * 2 + 1, neg[i]); push(i * 2, pos[i]); push(i * 2 + 1, pos[i]); pos[i] = neg[i] = 0; if (p <= mid) return query(p, i * 2, L, mid); else return query(p, i * 2 + 1, mid + 1, R); } } ll qt2(int p, int i = 1, int L = 1, int R = N) { if (L == R) return t2[i]; else { int mid = (L + R) / 2; push(i * 2, neg[i]); push(i * 2 + 1, neg[i]); push(i * 2, pos[i]); push(i * 2 + 1, pos[i]); pos[i] = neg[i] = 0; if (p <= mid) return t2[i] + qt2(p, i * 2, L, mid); else return t2[i] + qt2(p, i * 2 + 1, mid + 1, R); } } void modify(int mL, int mR, ll val, int i = 1, int L = 1, int R = Q + 1) { if (mL <= L && R <= mR) lazy[i] += val; else if (R < mL || mR < L) return; else { int mid = (L + R) / 2; lazy[i * 2] += lazy[i]; lazy[i * 2 + 1] += lazy[i]; lazy[i] = 0; modify(mL, mR, val, i * 2, L, mid); modify(mL, mR, val, i * 2 + 1, mid + 1, R); seg[i] = seg[i * 2 + 1] + lazy[i * 2 + 1]; } } int bsearch(ll val, int i = 1, int L = 1, int R = Q + 1) { if (L == R) return L; else { lazy[i * 2] += lazy[i]; lazy[i * 2 + 1] += lazy[i]; seg[i] += lazy[i]; lazy[i] = 0; int mid = (L + R) / 2; if (seg[i * 2] + lazy[i * 2] >= val) return bsearch(val, i * 2, L, mid); else return bsearch(val, i * 2 + 1, mid + 1, R); } } signed main() { ios::sync_with_stdio(0), cin.tie(0); cin >> N >> M >> Q; for (int i = 1; i <= Q; i++) { ll T, L, R, C, K; cin >> T >> L >> R; if (T == 1) { cin >> C >> K; t12(L, R, K); modifies.emplace_back(pair<int, pair<int, pll>>{L, {i, {C, K}}}); modifies.emplace_back(pair<int, pair<int, pll>>{R + 1, {i, {-C, -K}}}); color[i] = C; ans[i] = -1; } else if (T == 2) { cin >> K; t12(L, R, -K); ans[i] = -1; } else { pll cur = query(L); cur.F -= qt2(L); if (cur.S < R) ans[i] = 0; else queries.emplace_back(pair<int, pll>{L, {i, R + cur.F}}); } } sort(modifies.begin(), modifies.end()); sort(queries.begin(), queries.end()); int mdx = 0, qdx = 0; for (int i = 1; i <= N; i++) { while (mdx < modifies.size() && modifies[mdx].F == i) { modify(modifies[mdx].S.F, Q + 1, modifies[mdx].S.S.S); mdx++; } while (qdx < queries.size() && queries[qdx].F == i) { int t = bsearch(queries[qdx].S.S); if (t > queries[qdx].S.F) ans[queries[qdx].S.F] = 0; else ans[queries[qdx].S.F] = color[t]; qdx++; } } for (int i = 1; i <= Q; i++) if (ans[i] >= 0) cout << ans[i] << '\n'; } /* 3 4 7 3 1 1000000000 1 1 3 1 5000000000 1 1 2 4 5000000000 3 2 5000000001 1 1 3 3 5000000000 3 3 10000000000 3 1 15000000000 4 */

Compilation message (stderr)

foodcourt.cpp: In function 'int main()':
foodcourt.cpp:165:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, std::pair<long long int, long long int> > > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |         while (mdx < modifies.size() && modifies[mdx].F == i)
      |                ~~~~^~~~~~~~~~~~~~~~~
foodcourt.cpp:170:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  170 |         while (qdx < queries.size() && queries[qdx].F == 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...