虽然题目标题写的线段树,但实际上更适合用树状数组求解。先上传一下代码,后续再试试线段树。
#include <iostream> #include <vector> using namespace std; int n; vector<long long> c; int lowbit(int x) { return x & -x; } //计算a[1]至a[x]的和 long long getSum(int x) { long long ans = 0; while (x > 0) { ans += c[x]; x -= lowbit(x); } return ans; } //a[x]单点修改,增加addNum。c数组相应的x和x的所有祖先都要增加addNum void add(int x, int addNum) { while (x <= n) { c[x] += addNum; x += lowbit(x); } } int main() { int q, a; cin >> n >> q; c.resize(n + 1, 0); for (int i = 1; i <= n; ++i) { cin >> a; //后面三行代码可以用add(i, a);代替,但是时间复杂度增加 c[i] += a; int j = i + lowbit(i); if (j <= n) c[j] += c[i]; } int op, l, r; while (q--) { cin >> op >> l >> r; if (op == 1) { add(l, r); } else { cout << getSum(r) - getSum(l - 1) << endl; } } }