概述
/**
敌兵布阵 HDU-1166
线段树-单点修改-区间查询-敌兵布阵HDU-1166
*/
#include <iostream>
#include <string>
#define N 50005
using namespace std;
int n;
int sum[N << 2];
void push_up(int root) {
sum[root] = sum[root << 1] + sum[root << 1 | 1];
}
void buildTree(int l, int r, int root) {
if (l == r) {
int x;
cin >> x;
sum[root] = x;
return;
}
int mid = (l + r) >> 1;
buildTree(l, mid, root << 1);
buildTree(mid + 1, r, root << 1 | 1);
push_up(root);
}
void update(int k, int val, int l, int r, int root) {
if (l == k && r == k) {
sum[root] += val;
return;
}
int mid = (l + r) >> 1;
if (mid >= k) update(k, val, l, mid, root << 1);
else update(k, val, mid + 1, r, root << 1 | 1);
push_up(root);
}
int query(int L, int R, int l, int r, int root) {
if (L <= l && r <= R) {
return sum[root];
}
int mid = (l + r) >> 1;
int ans = 0;
if (L <= mid) ans += query(L, R, l, mid, root << 1);
if (mid < R) ans += query(L, R, mid + 1, r, root << 1 | 1);
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
for (int t = 1; t <= T; t++) {
int i, j;
cin >> n;
buildTree(1, n, 1);
cout << "Case " << t << ":" << endl;
string s = "";
while (cin >> s) {
if (s == "End") break;
cin >> i >> j;
if (s == "Query") {
cout << query(i, j, 1, n, 1) << endl;
} else if (s == "Add") {
update(i, j, 1, n, 1);
} else if (s == "Sub") {
update(i, -j, 1, n, 1);
}
s = "";
}
}
return 0;
}
最后
以上就是稳重向日葵为你收集整理的敌兵布阵 HDU-1166(线段树 单点修改 区间查询)的全部内容,希望文章能够帮你解决敌兵布阵 HDU-1166(线段树 单点修改 区间查询)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复