Submission #1330490

#TimeUsernameProblemLanguageResultExecution timeMemory
1330490behradFood Court (JOI21_foodcourt)C++17
100 / 100
642 ms37744 KiB
#ifdef LOCAL
#include "/home/bgopc/template/pch.hpp"
#endif
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 3e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20;
typedef pair<ll, ll> pii;
typedef array<ll, 5> query;

int n, m, q, L[maxn], R[maxn];
pii seg[maxn << 2];
vector<int> who[maxn];
ll fen[maxn];
query Q[maxn];

void addFen(int p, ll x) {
  for (; p <= n ; p += p & -p) fen[p] += x;
}

void addFen(int l, int r, ll x) {
  addFen(l, x);
  addFen(r, -x);
}

ll getFen(int p) {
  ll res = 0;
  for (; p ; p -= p & -p) res += fen[p];
  return res;
}

void tag(int id, int l, int r, ll x, ll y) {
  seg[id].ff += x;
  seg[id].ss = max(seg[id].ss + x, y);
}

void relax(int id, int l, int r) {
  int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
  tag(lc, l, mid, seg[id].ff, seg[id].ss);
  tag(rc, mid, r, seg[id].ff, seg[id].ss);
  seg[id].ff = seg[id].ss = 0;
}

void update(int ql, int qr, ll x, int l = 1, int r = n+1, int id = 1) {
  if (qr <= l || r <= ql) return;
  if (ql <= l && r <= qr) return tag(id, l, r, x, 0);

  relax(id, l, r);

  int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
  update(ql, qr, x, l, mid, lc);
  update(ql, qr, x, mid, r, rc);
}

ll get(int p, int l = 1, int r = n+1, int id = 1) {
  if (r - l == 1) return seg[id].ss;

  relax(id, l, r);

  int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
  if (p < mid) return get(p, l, mid, lc);
  else return get(p, mid, r, rc);
}

int32_t main() {
  cin.tie(0)->sync_with_stdio(0); 
  cin >> n >> m >> q;
  for (int i = 0 ; i < q ; i ++) {
    auto& [t, l, r, x, y] = Q[i];
    cin >> t;
    if (t == 1) {
      cin >> l >> r >> x >> y, r ++;
      addFen(l, r, y);
      update(l, r, y);
    } else if (t == 2) {
      cin >> l >> r >> x, r ++;
      update(l, r, -x);
    } else {
      cin >> x >> y;

      L[i] = -1, R[i] = i;
      y += getFen(x) - get(x);
    }
  }

  while (1) {
    for (int i = 0 ; i < q ; i ++) who[i].clear();
    for (int i = 0 ; i <= n ; i ++) fen[i] = 0;

    bool ok = 0;
    for (int i = 0 ; i < q ; i ++) {
      auto [t, l, r, x, y] = Q[i];
      if (t == 3 && R[i] - L[i] > 1) {
        int mid = (L[i] + R[i]) >> 1;
        who[mid].pb(i);
        ok = 1;
      }
    }
    if (ok == 0) break;

    for (int i = 0 ; i < q ; i ++) {
      {
        auto &[t, l, r, x, y] = Q[i];
        if (t == 1) addFen(l, r, y);
      }

      for (int j : who[i]) {
        auto &[t, l, r, x, y] = Q[j];
        if (getFen(x) >= y) R[j] = i;
        else L[j] = i;
      }
    }
  }

  for (int i = 0 ; i < q ; i ++) if (Q[i][0] == 3) {
    cout << (R[i] == i ? 0 : Q[R[i]][3]) << nl;
  }
}
#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...