Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=1166

开始学线段树,代码基本上是抄的

View Code
 1 //hdu 1166
2 #include <stdio.h>
3 const int N=50010;
4 int st[4*N],n;
5 void build(int l,int r,int rt)
6 {
7 if (l==r)
8 {
9 scanf("%d",&st[rt]);
10 return;
11 }
12 int m=(l+r)/2;
13 build(l,m,rt*2);
14 build(m+1,r,rt*2+1);
15 st[rt]=st[rt*2]+st[rt*2+1];
16 }
17 void add(int p,int a,int l,int r,int rt)
18 {
19 if (l==r)
20 {
21 st[rt]+=a;
22 return;
23 }
24 int m=(l+r)/2;
25 if (p<=m) add(p,a,l,m,rt*2);
26 else add(p,a,m+1,r,rt*2+1);
27 st[rt]=st[rt*2]+st[rt*2+1];
28 }
29 int sum(int ll,int rr,int l,int r,int rt)
30 {
31 if (ll<=l && r<=rr) return st[rt];
32 int m,s=0;
33 m=(l+r)/2;
34 if (ll<=m) s+=sum(ll,rr,l,m,rt*2);
35 if (rr>m) s+=sum(ll,rr,m+1,r,rt*2+1);
36 return s;
37 }
38 int main()
39 {
40 int T,C=0;
41 scanf("%d",&T);
42 while (T--)
43 {
44 printf("Case %d:\n",++C);
45 scanf("%d",&n);
46 build(1,n,1);
47 char op[6];
48 int a,b;
49 while (scanf("%s",op),op[0]!='E')
50 {
51 scanf("%d%d",&a,&b);
52 switch (op[0])
53 {
54 case 'A': add(a,b,1,n,1); break;
55 case 'S': add(a,-b,1,n,1); break;
56 case 'Q': printf("%d\n",sum(a,b,1,n,1)); break;
57 }
58 }
59 }
60 return 0;
61 }

 

posted on 2012-02-14 19:05  Qiuqiqiu  阅读(117)  评论(0编辑  收藏  举报