AcWing 242. 一个简单的整数问题
原题链接
简单
作者:
雨_56
,
2025-03-13 22:55:37
·湖南
,
所有人可见
,
阅读 1
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
template <typename T>
struct Fenwick
{
int n;
vector<T> a;
Fenwick(int n_ = 0)
{
init(n_);
}
void init(int n_)
{
n = n_;
a.assign(n, T{});
}
void add(int x, const T &v)
{
for (int i = x + 1; i <= n; i += i & -i)
{
a[i - 1] = a[i - 1] + v; //范围 [0, n-1]
}
}
T sum(int x) //返回前 x 项的和(1-based)
{
T ans{};
for (int i = x; i > 0; i -= i & -i)
{
ans = ans + a[i - 1];
}
return ans;
}
T rangeSum(int l, int r) //返回区间 [l, r), (0-based)
{
return sum(r) - sum(l);
}
int select(const T &k) //返回前缀和 ≥k 的最小位置 (0-based)
{
int x = 0;
T cur{};
for (int i = 1 << __lg(n); i; i /= 2)
{
if (x + i <= n && cur + a[x + i - 1] <= k)
{
x += i;
cur = cur + a[x - 1];
}
}
return x;
}
};
int main(){
int n, q;
cin >> n >> q;
vector<i64> a(n);
Fenwick<i64> fw(n);
for(int i = 0; i < n; i++) {
cin >> a[i];
if(i == 0)fw.add(i, a[i]);
else fw.add(i, a[i] - a[i - 1]);
}
while(q--) {
char op;
int l, r, k;
cin >> op >> l;
if(op == 'C') {
cin >> r >> k;
fw.add(l - 1, k);
fw.add(r, -k);
}
else {
cout << fw.sum(l) << endl;
}
}
return 0;
}