Submission #1361850

#TimeUsernameProblemLanguageResultExecution timeMemory
1361850avighnaLegendary Dango Eater (JOI26_dango)C++20
23 / 100
782 ms168376 KiB
#include <bits/stdc++.h>

using namespace std;

const int K = 10;
int k;

struct node {
  pair<int64_t, int> state[K];
  node() {
    state[0] = {-1, -1};
  }
  node(int64_t x) {
    for (int sum = 0; sum < K; ++sum) {
      int64_t nsum = max(sum + x, int64_t(0));
      state[sum] = {nsum / k, nsum % k};
    }
  }
  node operator+(const node &r) {
    if (this->state[0].first == -1) return r;
    if (r.state[0].first == -1) return *this;
    node ans;
    for (int sum = 0; sum < K; ++sum) {
      int64_t get = state[sum].first;
      int64_t nsum = state[sum].second;
      get += r.state[nsum].first;
      ans.state[sum] = {get, r.state[nsum].second};
    }
    return ans;
  }
};

class segment_tree {
  int n;
  vector<node> seg;

public:
  segment_tree(int n) : n(n), seg(2 * n) {}

  void set(int i, int64_t x) {
    seg[i += n] = node(x);
    for (i >>= 1; i > 0; i >>= 1) {
      seg[i] = seg[2 * i] + seg[2 * i + 1];
    }
  }

  node query(int l, int r) {
    node ansL, ansR;
    for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
      if (l & 1) ansL = ansL + seg[l++];
      if (r & 1) ansR = seg[--r] + ansR;
    }
    return ansL + ansR;
  }
};

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

  int n, q;
  cin >> n >> q >> k;
  vector<int64_t> a(n);
  segment_tree st(n);
  for (int i = 0; i < n; ++i) {
    cin >> a[i];
    if (i & 1) {
      a[i] = -a[i];
    }
    st.set(i, a[i]);
  }

  while (q--) {
    int l, r;
    cin >> l >> r;
    --l, --r;
    node ans = st.query(l, r);
    cout << ans.state[0].first << '\n';
  }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...