NYOJ 123

View Code
 1 /*
2 问题:
3 在一个数组中 不断在某些区间中增加值
4 询问 某一节点 的值
5 思路:
6 树状数组(插线法):
7 */
8 #include<iostream>
9 #include<cstdio>
10 using namespace std;
11
12 int lt[1000001];
13 int T,N;
14
15 int lowbit(int x)
16 {
17 return x&(-x);
18 }
19 void add(int s,int v)
20 {
21 while(s>0)
22 {
23 lt[s]+=v;
24 s-=lowbit(s);
25 }
26 }
27
28 int sum(int n)
29 {
30 int te=0;
31 while(n<=N)
32 {
33 te+=lt[n];
34 n+=lowbit(n);
35 }
36 return te;
37 }
38 int main()
39 {
40 int i,s,e,v,t;
41 char ch[6];
42 scanf("%d%d",&T,&N);
43 for(i=0;i<=N;++i)
44 lt[i]=0;
45 while(T--)
46 {
47 scanf("%s",ch);
48 if(ch[0]=='A')
49 {
50 scanf("%d%d%d",&s,&e,&v);
51 add(s-1,-v);// 相当于把从 1到 s-1的战功减去 v
52 add(e,v); // 相当于把从 1到V的战功加上V
53 }
54 else
55 {
56 scanf("%d",&t);
57 printf("%d\n",sum(t));
58 }
59 }
60 system("pause");
61 return 0;
62 }

 

posted @ 2012-02-12 11:28  知行执行  阅读(225)  评论(0编辑  收藏  举报