Submission #1340142

#TimeUsernameProblemLanguageResultExecution timeMemory
1340142avighna푸드 코트 (JOI21_foodcourt)C++20
0 / 100
319 ms37544 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 250000;

struct add_set {
  bool has_set;
  int64_t add, set;
};

add_set get_add(int64_t add) {
  add_set res;
  res.has_set = false;
  res.add = add;
  return res;
}

add_set get_set(int64_t set) {
  add_set res;
  res.has_set = true;
  res.set = set;
  return res;
}

add_set operator+(const add_set &pr, const add_set &a) {
  if (pr.has_set) {
    add_set ans = pr;
    if (a.has_set) {
      ans.set = a.set;
    } else {
      ans.set += a.add;
    }
    return ans;
  } else {
    if (a.has_set) {
      return a;
    }
    add_set ans = pr;
    ans.add += a.add;
    return ans;
  }
}

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

void push(int v, int tl, int tr) {
  if (lazy[v].has_set) {
    seg[v] = lazy[v].set * (tr - tl + 1);
    segmin[v] = segmax[v] = lazy[v].set;
    lazy[2 * v] = lazy[2 * v] + lazy[v];
    lazy[2 * v + 1] = lazy[2 * v + 1] + lazy[v];
    lazy[v].has_set = false;
  } else if (lazy[v].add != 0) {
    seg[v] += lazy[v].add * (tr - tl + 1);
    segmin[v] += lazy[v].add;
    segmax[v] += lazy[v].add;
    lazy[2 * v] = lazy[2 * v] + lazy[v];
    lazy[2 * v + 1] = lazy[2 * v + 1] + lazy[v];
    lazy[v].add = 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] = lazy[v] + get_add(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] = lazy[v] + get_add(-del);
      push(v, tl, tr);
      return;
    }
    if (segmin[v] == segmax[v]) {
      lazy[v] = lazy[v] + get_add(-segmin[v]);
      push(v, tl, tr);
      return;
    }
    if (segmax[v] <= del) {
      lazy[v] = lazy[v] + get_set(0);
      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...