HDU
来源:互联网 发布:mac电脑怎么截长图 编辑:程序博客网 时间:2024/05/20 05:29
HDU - 1166 题目
思路: 最基础的线段树,之前写过了(单点更新 + 区间求和)试了试树状数组,毕竟今天的补题也用到了。
#include <cstdio>#include <iostream>#include <cstring>using namespace std;#define met(a,b) memset(a,b,sizeof(a))const int maxn = 5e4 + 10;int c[maxn];int a[maxn];int n;int lowbit(int x) { return x&-x; }int add(int x,int v){ for(int i = x; i <= n; i += lowbit(i)) { c[i] += v; } return 0;}int query(int x){ int ans = 0; for(int i = x; i > 0; i -= lowbit(i)) ans += c[i]; return ans;}int main(){ int t,x; scanf("%d",&t); for(int kase = 1; kase <= t; kase ++) { met(c,0); scanf("%d",&n); for(int i = 1; i <= n ; i++) { scanf("%d",&x); add(i,x);} char s[20]; printf("Case %d:\n",kase); int a,b; while(~scanf("%s%d%d",s,&a,&b) && s[0] != 'E') { if(s[0] == 'Q') printf("%d\n",query(b) - query(a-1)); else s[0] == 'S' ? add(a, -b) : add(a, b); } } return 0;}