Submission #1340134

#TimeUsernameProblemLanguageResultExecution timeMemory
1340134avighnaFood Court (JOI21_foodcourt)C++20
0 / 100
1095 ms21224 KiB
#pragma GCC optimize("Ofast,unroll-all-loops")

#include <bits/stdc++.h>

using namespace std;

const int N = 250000;

int64_t seg[4 * N], segmin[4 * N], segmax[4 * N], lazy[8 * N];

void 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;
}

void 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]);
}

void add(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;
  add(2 * v, tl, tm, l, r, del);
  add(2 * v + 1, tm + 1, tr, l, r, del);
  pull(v);
}

auto sub(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;
  sub(2 * v, tl, tm, l, r, del);
  sub(2 * v + 1, tm + 1, tr, l, r, del);
  pull(v);
}

int64_t query(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 query(2 * v, tl, tm, idx) + query(2 * v + 1, tm + 1, tr, idx);
}

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);
  int n, m, q;
  cin >> n >> m >> q;

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