This documentation is automatically generated by competitive-verifier/competitive-verifier
#include "dp/cumulative-sum.hpp"
$1$ 次元の累積和. 前計算として事前に累積和をとることで, 区間の和を $O(1)$ で求めることが出来る.
add(k, x)
: 要素 k
に値 x
を加える.build()
: 累積和を構築する.fold(r)
: 区間 $[0, k)$ の和を返す.fold(l, r)
: 区間 $[l, r)$ の和を返す.add(k, x)
: $O(1)$build()
: $O(N)$fold(r)
: $O(1)$fold(l, r)
: $O(1)$template <class T>
struct CumulativeSum {
vector<T> data;
CumulativeSum() = default;
explicit CumulativeSum(size_t sz) : data(sz + 1, 0) {}
void add(int k, const T &x) { data[k + 1] += x; }
void build() {
for (int i = 1; i < data.size(); i++) {
data[i] += data[i - 1];
}
}
T fold(int r) const {
if (r < 0) return 0;
return data[min(r, (int)data.size() - 1)];
}
T fold(int l, int r) const { return fold(r) - fold(l); }
};
#line 1 "dp/cumulative-sum.hpp"
template <class T>
struct CumulativeSum {
vector<T> data;
CumulativeSum() = default;
explicit CumulativeSum(size_t sz) : data(sz + 1, 0) {}
void add(int k, const T &x) { data[k + 1] += x; }
void build() {
for (int i = 1; i < data.size(); i++) {
data[i] += data[i - 1];
}
}
T fold(int r) const {
if (r < 0) return 0;
return data[min(r, (int)data.size() - 1)];
}
T fold(int l, int r) const { return fold(r) - fold(l); }
};