P3374 【模板】树状数组 1

题目描述

如题,已知一个数列,你需要进行下面两种操作:

1.将某一个数加上x

2.求出某区间每一个数的和

输入输出格式

输入格式:

 

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3个整数,表示一个操作,具体如下:

操作1: 格式:1 x k 含义:将第x个数加上k

操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和

 

输出格式:

 

输出包含若干行整数,即为所有操作2的结果。

输入输出样例

输入样例#1: 复制
5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
输出样例#1: 复制
14
16

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=500000,M<=500000

样例说明:

故输出结果14、16

既然是模板的话,,,

那就背过吧。。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int n,m;
 9 int a[500002];
10 
11 void add(int l,int r)
12 {
13     while(l<=n)
14     {
15         a[l]+=r;
16         l+=l&(-l);
17     }
18 }
19 
20 int sum(int x)
21 {
22     int num=0;
23     while(x)
24     {
25         num+=a[x];
26         x-=x&(-x);        
27     }
28     return num;
29 }
30 
31 int main()
32 {
33     int x,a,b,c;
34     scanf("%d%d",&n,&m);
35     for(int i=1;i<=n;++i)
36     {
37         scanf("%d",&x);
38         add(i,x);
39     }
40     for(int i=1;i<=m;++i)
41     {
42         scanf("%d%d%d",&a,&b,&c);
43         if(a==1) add(b,c);
44         else printf("%d\n",sum(c)-sum(b-1));
45     }
46     return 0;
47 }

如果你不开心,那我就把右边这个帅傻子分享给你吧, 

你看,他这么好看,那么深情的望着你,你还伤心吗? 

真的!这照片盯上他五秒钟就想笑了。 

一切都会过去的。

猜你喜欢

转载自www.cnblogs.com/Mary-Sue/p/9442669.html