线段树之sum

线段树之Sum

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 54  Solved: 47
[Submit][Status][Web Board][Edit] [TestData]

Description

给定一数列,规定有两种操作,一是修改某个元素,二是求区间的连续和。 

Input

输入数据第一行包含两个正整数n,m(n<=100000,m<=500000),以下是m行, 
每行有三个正整数k,a,b(k=0或1, a,b<=n).
k=0时表示将a处数字加上b,k=1时表示询问区间[a,b]内所有数的和。

Output

对于每个询问输出对应的答案。

Sample Input

10 20
0 1 10
1 1 4
0 6 6
1 4 10
1 8 9
1 4 9
0 10 2
1 1 8
0 2 10
1 3 9
0 7 8
0 3 10
0 1 1
1 3 8
1 6 9
0 5 5
1 1 8
0 4 2
1 2 8
0 1 1

Sample Output

10
6
0
6
16
6
24
14
50
41

HINT

 

 最简单的线段树
 1 #include<cstdio>
 2 using namespace std;
 3 int ans;
 4 struct segment_tree{
 5     int tree[400001]; 
 6     void Update(int num,int l,int r,int a,int b)
 7     {
 8         if(l==r)
 9         {
10             tree[num]+=b;
11             return;
12         }
13         int mid=(l+r)/2;
14         if(a<=mid)
15             Update(num*2,l,mid,a,b);
16         if(a>mid)
17             Update(num*2+1,mid+1,r,a,b);
18         tree[num]=tree[num*2]+tree[num*2+1];
19     }
20     void Query(int num,int l,int r,int a,int b)
21     {
22         if(l==r)
23         {
24             ans+=tree[num];
25             return;
26         }
27         if(l>=a && r<=b)
28         {
29             ans+=tree[num];
30             return;
31         }
32         int mid=(l+r)/2;
33         if(a<=mid)
34             Query(num*2,l,mid,a,b);
35         if(b>mid)
36             Query(num*2+1,mid+1,r,a,b);
37         return;
38     }
39 }S;
40 int main()
41 {
42     int n,m,k,a,b;
43     scanf("%d%d",&n,&m); 
44     for(int i=1;i<=m;i++)
45     {
46         scanf("%d%d%d",&k,&a,&b);
47         if(k==0)
48             S.Update(1,1,n,a,b);
49         else
50         {
51             ans=0;
52             S.Query(1,1,n,a,b);
53             printf("%d\n",ans);
54         }
55     }
56     return 0;
57 }
sum

 

posted @ 2017-12-16 21:01  LHR-LHR  阅读(173)  评论(0编辑  收藏  举报