HDU 1166 敌兵布阵
单调更新区间查询和
#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 50010; const int INF = 0x3f3f3f3f; struct node { int l,r; int sum; }tree[MAXN * 4]; int src[MAXN]; void build(int id,int l,int r) { tree[id].l = l; tree[id].r = r; if (l == r) { tree[id].sum = src[l]; return; } int mid = (l + r) / 2; build(id * 2,l,mid); build(id * 2 + 1,mid + 1,r); tree[id].sum = tree[id * 2].sum + tree[id * 2 + 1].sum; } void update(int id,int pos,int val) { if (tree[id].l == pos && tree[id].r == pos) { tree[id].sum += val; return; } int mid = (tree[id].l + tree[id].r) / 2; if (pos <= mid) update(id * 2,pos,val); else update(id * 2 + 1,pos,val); tree[id].sum = tree[id * 2].sum + tree[id * 2 + 1].sum; } int query(int id,int l,int r) { if (tree[id].l >= l && tree[id].r <= r) { return tree[id].sum; } int mid = (tree[id].l + tree[id].r) / 2; if (l > mid) return query(id * 2 + 1,l,r); else if (r <= mid) return query(id * 2,l,r); else { return query(id * 2 ,l,mid) + query(id * 2 + 1,mid + 1,r); } } int main() { int T,kase = 1; scanf("%d",&T); while (T--) { int N; scanf("%d",&N); for (int i = 1 ; i <= N ; i++) scanf("%d",&src[i]); build(1,1,N); printf("Case %d:\n",kase++); char op[10]; while(scanf("%s",op) != EOF) { if (op[0] == 'E') break; if (op[0] == 'Q') { int l,r; scanf("%d%d",&l,&r); printf("%d\n",query(1,l,r)); } if (op[0] == 'A') { int x,val; scanf("%d%d",&x,&val); update(1,x,val); } if(op[0] == 'S') { int x,val; scanf("%d%d",&x,&val); update(1,x,-val); } } } return 0; }