树状数组的区间修改和区间查询模板

来源:互联网 发布:国家网络安全法 编辑:程序博客网 时间:2024/06/05 17:38

例题:http://codevs.cn/problem/1082/

#include <iostream>using namespace std;#define lowbit(x) ((x) & (-(x)))long long arrC1[200010], arrC2[200010];long long iNumTot;long long GetSum(long long iIndex){long long iAns1 = 0, iAns2 = 0;for (int i = iIndex; i; i -= lowbit(i)){iAns1 += arrC1[i];iAns2 += arrC2[i];}return iIndex * iAns1 - iAns2;}void AddNum(int iIndex, long long iDelta){for (int i = iIndex; i <= iNumTot; i += lowbit(i)){arrC1[i] += iDelta;arrC2[i] += (iIndex - 1) * iDelta;}}int main(){cin >> iNumTot;long long iTmp;for (int i = 1; i <= iNumTot; i++){cin >> iTmp;AddNum(i, iTmp);AddNum(i + 1, -iTmp);}int iCaseTot;cin >> iCaseTot;long long iType, a, b, iDelta;while (iCaseTot--){cin >> iType >> a >> b;if (a > b)swap(a, b);if (iType == 1){cin >> iDelta;AddNum(a, iDelta);AddNum(b + 1, -iDelta);}else if (iType == 2)cout << GetSum(b) - GetSum(a - 1) << endl;}return 0;}


原创粉丝点击