Submission #386363

#TimeUsernameProblemLanguageResultExecution timeMemory
386363Mamnoon_SiamFood Court (JOI21_foodcourt)C++17
100 / 100
686 ms63380 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ii = pair<int, int>; using vi = vector<int>; #define all(v) begin(v), end(v) #define sz(v) (int)(v).size() #define fi first #define se second struct info { ll x = 0, y = 0; info operator + (const info& o) const { info r; if(y >= o.x) r.y = y - o.x, r.x = x; else r.y = 0, r.x = x + (o.x - y); r.y += o.y; return r; } }; struct Node { Node *l = 0, *r = 0; info lz; int lo, hi; Node(int _lo, int _hi) : lo(_lo), hi(_hi) { if(lo < hi) { int mid = (lo + hi) >> 1; l = new Node(lo, mid), r = new Node(mid+1, hi); } } void update(int L, int R, info v) { if(lo > R or hi < L) return; if(L <= lo and hi <= R) { lz = lz + v; } else { push(); l -> update(L, R, v); r -> update(L, R, v); } } ll query(int pos) { if(lo == hi) return lz.y; else { push(); return pos <= l -> hi ? l -> query(pos) : r -> query(pos); } } void push() { if(lo < hi) { l -> lz = l -> lz + lz; r -> lz = r -> lz + lz; } lz = info(); } }; const int N = 250005; const int lg = 19; int n, m, q; int type[N], L[N], R[N], A[N], C[N], K[N]; int lo[N], hi[N], mid[N]; ll B[N]; vi upds[N], ask[N]; int ans[N]; namespace bit { ll ft[N]; void update(int p, ll x) { for(; p <= q; p += p & -p) ft[p] += x; } int query(ll x) { // minimum i such that sum(1, i) <= x int idx = 0; ll sm = 0; for(int pw = 1 << (lg-1); pw; pw >>= 1) { if((idx|pw) <= q and sm + ft[idx|pw] < x) { idx |= pw; sm += ft[idx]; } } return idx+1; } } namespace bit2 { ll ft[N]; void update(int l, int r, ll x) { for(; l <= n; l += l & -l) ft[l] += x; for(++r; r <= n; r += r & -r) ft[r] -= x; } ll query(int p, ll ret = 0) { for(; p > 0; p -= p & -p) ret += ft[p]; return ret; } } Node* tr; void Join(int l, int r, int c, int k) { tr -> update(l, r, info{0, k}); bit2::update(l, r, k); } void Leave(int l, int r, int k) { tr -> update(l, r, info{k, 0}); } ll Service(int a, ll b) { ll tmp = tr -> query(a); return tmp < b ? ll(1e15) : b + bit2::query(a) - tmp; // return tr -> query(a) >= b; } int main(int argc, char const *argv[]) { #ifdef LOCAL freopen("in", "r", stdin); #endif scanf("%d %d %d", &n, &m, &q); // assert(m == 1); tr = new Node(1, n); for(int i = 1; i <= q; ++i) { int &t = type[i]; scanf("%d", &t); if(t == 1) { int &l = L[i], &r = R[i], &c = C[i], &k = K[i]; scanf("%d %d %d %d", &l, &r, &c, &k); Join(l, r, c, k); upds[l].emplace_back(i); upds[r+1].emplace_back(-i); } else if(t == 2) { int &l = L[i], &r = R[i], &k = K[i]; scanf("%d %d %d", &l, &r, &k); Leave(l, r, k); } else { int &a = A[i]; ll &b = B[i]; scanf("%d %lld", &a, &b); b = Service(a, b); ask[a].emplace_back(i); // printf("%d\n", Service(a, b)); } } for(int i = 1; i <= n; ++i) { for(int j : upds[i]) { if(j > 0) bit::update(j, K[j]); else bit::update(-j, -K[-j]); } for(int j : ask[i]) { ans[j] = bit::query(B[j]); } } for(int i = 1; i <= q; ++i) if(type[i] == 3) { printf("%d\n", ans[i] > q ? 0 : C[ans[i]]); } return 0; }

Compilation message (stderr)

foodcourt.cpp: In function 'int main(int, const char**)':
foodcourt.cpp:120:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  120 |   scanf("%d %d %d", &n, &m, &q);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:124:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  124 |     int &t = type[i]; scanf("%d", &t);
      |                       ~~~~~^~~~~~~~~~
foodcourt.cpp:127:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  127 |       scanf("%d %d %d %d", &l, &r, &c, &k);
      |       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:133:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  133 |       scanf("%d %d %d", &l, &r, &k);
      |       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:137:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  137 |       scanf("%d %lld", &a, &b);
      |       ~~~~~^~~~~~~~~~~~~~~~~~~
#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...