Submission #554595

#TimeUsernameProblemLanguageResultExecution timeMemory
554595MilosMilutinovicFood Court (JOI21_foodcourt)C++14
100 / 100
634 ms80464 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);  
  int n, m, q;
  cin >> n >> m >> q;
  vector<int> t(q);
  vector<int> l(q);
  vector<int> r(q);
  vector<int> c(q);
  vector<long long> k(q);
  vector<long long> a(q);
  vector<long long> b(q);
  vector<vector<pair<int, long long>>> qs(n + 1);
  vector<vector<pair<int, long long>>> xs(n + 1);
  vector<vector<pair<int, long long>>> fs(n + 1);
  for (int i = 0; i < q; i++) {
    cin >> t[i];
    if (t[i] == 1) {
      cin >> l[i] >> r[i] >> c[i] >> k[i];
      --l[i];
      qs[l[i]].emplace_back(i, k[i]);
      qs[r[i]].emplace_back(i, 0);
      fs[l[i]].emplace_back(i, k[i]);
      fs[r[i]].emplace_back(i, 0);
    } else if (t[i] == 2) {
      cin >> l[i] >> r[i] >> k[i];
      --l[i];
      qs[l[i]].emplace_back(i, -k[i]);
      qs[r[i]].emplace_back(i, 0);
    } else {
      cin >> a[i] >> b[i];
      --a[i];
      xs[a[i]].emplace_back(i, b[i]);
    }
  }
  vector<long long> sum(4 * q);
  vector<long long> suf(4 * q);
  vector<long long> st(4 * q);  
  function<void(int, int, int, int, long long)> modify = [&](int node, int l, int r, int i, long long v) {
    if (l == r) {
      sum[node] = v;
      suf[node] = max(0LL, v);
      return;
    }
    int mid = l + r >> 1;
    if (i <= mid) {
      modify(node + node, l, mid, i, v);
    } else {
      modify(node + node + 1, mid + 1, r, i, v);
    }
    sum[node] = sum[node + node] + sum[node + node + 1]; 
    suf[node] = max(suf[node + node + 1], suf[node + node] + sum[node + node + 1]);
  };
  function<pair<long long, long long>(int, int, int, int, int)> query = [&](int node, int l, int r, int ll, int rr) {
    if (l > r || l > rr || r < ll) return make_pair(0LL, 0LL);
    if (ll <= l && r <= rr) return make_pair(sum[node], suf[node]);
    int mid = l + r >> 1;
    auto L = query(node + node, l, mid, ll, rr);
    auto R = query(node + node + 1, mid + 1, r, ll, rr);
    return make_pair(L.first + R.first, max(R.second, L.second + R.first));
  };
  function<void(int, int, int, int, long long)> update = [&](int node, int l, int r, int i, long long x) {    
    if (l == r) {
      st[node] = x;
      return;
    }
    int mid = l + r >> 1;
    if (i <= mid) {
      update(node + node, l, mid, i, x);
    } else {
      update(node + node + 1, mid + 1, r, i, x);
    }
    st[node] = st[node + node] + st[node + node + 1];
  };
  function<long long(int, int, int, int, int)> get = [&](int node, int l, int r, int ll, int rr) {
    if (l > r || l > rr || r < ll) return 0LL;
    if (ll <= l && r <= rr) return st[node];
    int mid = l + r >> 1;
    return get(node + node, l, mid, ll, rr) + get(node + node + 1, mid + 1, r, ll, rr);
  };
  function<int(int, int, int, long long)> walk = [&](int node, int l, int r, long long x) {
    if (l == r) {
      return st[node] > x ? l - 1 : l;
    }
    int mid = l + r >> 1;
    if (st[node + node] > x) {
      return walk(node + node, l, mid, x);
    } else {
      return walk(node + node + 1, mid + 1, r, x - st[node + node]);
    }
  };
  vector<long long> ans(q);
  for (int i = 0; i < n; i++) {
    for (auto& p : qs[i]) {
      modify(1, 0, q - 1, p.first, p.second);
    }
    for (auto& p : fs[i]) {
      update(1, 0, q - 1, p.first, p.second);
    }
    for (auto& p : xs[i]) {
      long long curr = query(1, 0, q - 1, 0, p.first).second;
      if (curr < p.second) {
        ans[p.first] = 0;      
      } else {             
        long long d = get(1, 0, q - 1, 0, p.first) - curr + p.second;
        ans[p.first] = c[walk(1, 0, q - 1, d - 1) + 1];
      }
    }
  }
  for (int i = 0; i < q; i++) {
    if (t[i] == 3) {
      cout << ans[i] << '\n';
    }
  }                        
  return 0;
}

Compilation message (stderr)

foodcourt.cpp: In lambda function:
foodcourt.cpp:49:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   49 |     int mid = l + r >> 1;
      |               ~~^~~
foodcourt.cpp: In lambda function:
foodcourt.cpp:61:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   61 |     int mid = l + r >> 1;
      |               ~~^~~
foodcourt.cpp: In lambda function:
foodcourt.cpp:71:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   71 |     int mid = l + r >> 1;
      |               ~~^~~
foodcourt.cpp: In lambda function:
foodcourt.cpp:82:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   82 |     int mid = l + r >> 1;
      |               ~~^~~
foodcourt.cpp: In lambda function:
foodcourt.cpp:89:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   89 |     int mid = l + r >> 1;
      |               ~~^~~
#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...