Submission #1340132

#TimeUsernameProblemLanguageResultExecution timeMemory
1340132avighnaFood Court (JOI21_foodcourt)C++20
0 / 100
1097 ms39780 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  int n, m, q;
  cin >> n >> m >> q;

  vector<int64_t> seg(4 * n), segmin(4 * n), segmax(4 * n), lazy(8 * n);
  auto push = [&](int v, int tl, int tr) {
    seg[v] += lazy[v] * (tr - tl + 1);
    segmin[v] += lazy[v];
    segmax[v] += lazy[v];
    lazy[2 * v] += lazy[v];
    lazy[2 * v + 1] += lazy[v];
    lazy[v] = 0;
  };
  auto pull = [&](int v) {
    seg[v] = seg[2 * v] + seg[2 * v + 1];
    segmin[v] = min(segmin[2 * v], segmin[2 * v + 1]);
    segmax[v] = max(segmax[2 * v], segmax[2 * v + 1]);
  };
  auto add = [&](auto &&self, int v, int tl, int tr, int l, int r, int64_t del) {
    push(v, tl, tr);
    if (tr < l || r < tl) {
      return;
    }
    if (l <= tl && tr <= r) {
      lazy[v] += del;
      push(v, tl, tr);
      return;
    }
    int tm = (tl + tr) / 2;
    self(self, 2 * v, tl, tm, l, r, del);
    self(self, 2 * v + 1, tm + 1, tr, l, r, del);
    pull(v);
  };
  auto sub = [&](auto &&self, int v, int tl, int tr, int l, int r, int64_t del) {
    push(v, tl, tr);
    if (tr < l || r < tl) {
      return;
    }
    if (l <= tl && tr <= r) {
      if (segmin[v] >= del) {
        lazy[v] -= del;
        push(v, tl, tr);
        return;
      }
      if (segmin[v] == segmax[v]) {
        lazy[v] -= segmin[v];
        push(v, tl, tr);
        return;
      }
    }
    int tm = (tl + tr) / 2;
    self(self, 2 * v, tl, tm, l, r, del);
    self(self, 2 * v + 1, tm + 1, tr, l, r, del);
    pull(v);
  };
  auto query = [&](auto &&self, int v, int tl, int tr, int idx) {
    push(v, tl, tr);
    if (idx < tl || idx > tr) {
      return int64_t(0);
    }
    if (tl == idx && idx == tr) {
      return seg[v];
    }
    int tm = (tl + tr) / 2;
    return self(self, 2 * v, tl, tm, idx) + self(self, 2 * v + 1, tm + 1, tr, idx);
  };

  while (q--) {
    int t;
    cin >> t;
    if (t == 1) {
      int64_t l, r, c, k;
      cin >> l >> r >> c >> k;
      --l, --r;
      add(add, 1, 0, n - 1, l, r, k);
    } else if (t == 2) {
      int64_t l, r, k;
      cin >> l >> r >> k;
      --l, --r;
      sub(sub, 1, 0, n - 1, l, r, k);
    } else {
      int64_t a, b;
      cin >> a >> b;
      --a, --b;
      int64_t sz = query(query, 1, 0, n - 1, a);
      if (b < sz) {
        cout << "1\n";
      } else {
        cout << "0\n";
      }
    }
  }
}
#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...