Submission #585277

#TimeUsernameProblemLanguageResultExecution timeMemory
585277Soumya1푸드 코트 (JOI21_foodcourt)C++17
68 / 100
1094 ms38604 KiB
#include <bits/stdc++.h>
#ifdef __LOCAL__
  #include <debug_local.h>
#endif
using namespace std;
const int mxN = 250005;
struct Node {
  long long sum, max_suf, pos_sum;
  Node() { sum = max_suf = pos_sum = 0; }
} t[4 * mxN];
void propagate(int x, int lx, int rx) {
  if (lx == rx) return;
  t[x << 1].sum += t[x].sum;
  t[x << 1 | 1].sum += t[x].sum;
  t[x << 1].max_suf = max({t[x].sum + t[x << 1].max_suf, t[x].max_suf, 0LL});
  t[x << 1 | 1].max_suf = max({t[x].sum + t[x << 1 | 1].max_suf, t[x].max_suf, 0LL});
  t[x << 1].pos_sum += t[x].pos_sum;
  t[x << 1 | 1].pos_sum += t[x].pos_sum;
  t[x] = Node();
}
void update(int x, int lx, int rx, int l, int r, int k) {
  if (t[x].sum != 0 || t[x].max_suf != 0 || t[x].pos_sum != 0) propagate(x, lx, rx);
  if (l > rx || lx > r) return;
  if (l <= lx && r >= rx) {
    t[x].sum += k;
    t[x].pos_sum += max(k, 0);
    t[x].max_suf = max(t[x].max_suf + k, 0LL);
    return;
  }
  int mx = (lx + rx) >> 1;
  update(x << 1, lx, mx, l, r, k);
  update(x << 1 | 1, mx + 1, rx, l, r, k);
}
Node query(int x, int lx, int rx, int i) {
  if (t[x].sum != 0 || t[x].max_suf != 0 || t[x].pos_sum != 0) propagate(x, lx, rx);
  if (lx == rx) return t[x];
  int mx = (lx + rx) >> 1;
  if (i <= mx) return query(x << 1, lx, mx, i);
  return query(x << 1 | 1, mx + 1, rx, i);
}
void testCase() {
  int n, m, q;
  cin >> n >> m >> q;
  vector<pair<int, long long>> Q;
  vector<tuple<int, int, int, int>> updates;
  updates.push_back({1, n, 0, 0});
  for (int i = 1; i <= q; i++) {
    int t;
    cin >> t;
    if (t == 1) {
      int l, r, c, k;
      cin >> l >> r >> c >> k;
      update(1, 1, n, l, r, k);
      updates.push_back({l, r, k, c});
    } else if (t == 2) {
      int l, r, k;
      cin >> l >> r >> k;
      update(1, 1, n, l, r, -k);
    } else {
      int a;
      long long b;
      cin >> a >> b;
      auto x = query(1, 1, n, a);
      long long rem = x.max_suf;
      long long added = x.pos_sum;
      if (rem >= b) {
        Q.push_back({a, added - rem + b});
      } else {
        Q.push_back({a, 0});
      }
    }
  }
  q = Q.size();
  vector<int> lo(q), hi(q);
  for (int i = 0; i < q; i++) {
    lo[i] = 0, hi[i] = max(0, (int) updates.size() - 1);
  }
  for (int iter = 0; iter < 20; iter++) {
    for (int i = 0; i <= 4 * n; i++) t[i] = Node();
    vector<tuple<int, long long, int>> qq[updates.size()];
    for (int i = 0; i < q; i++) {
      qq[(lo[i] + hi[i]) / 2].push_back({Q[i].first, Q[i].second, i});
    }
    for (int i = 0; i < updates.size(); i++) {
      auto [l, r, k, c] = updates[i];
      update(1, 1, n, l, r, k);
      for (auto [a, b, id] : qq[i]) {
        auto x = query(1, 1, n, a);
        if (x.sum >= b) hi[id] = i;
        else lo[id] = i + 1; 
      }
    }
  }
  for (int i = 0; i < q; i++) {
    cout << get<3> (updates[lo[i]]) << "\n";
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  testCase();
}

Compilation message (stderr)

foodcourt.cpp: In function 'void testCase()':
foodcourt.cpp:84:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |     for (int i = 0; i < updates.size(); 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...