树状数组的基本运用

问题描述

给定n个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b]的连续和。数列的元素个数最多100000个,询问操作最多100000次。 

输入

第一行2个整数n,m(n表示输入n个数列,m表示有m个操作)
第二行输入n个数列。
接下来M行,每行有三个数k,a,b(k=0表示求子数列[a,b]的和,k=1表示第a个数列加b)

输出

输出若干行数字,表示每次K=0时对应输出一个子数列[a,b]的连续和。

输入样列
10  5
1 2 3 4 5 6 7 8 9 10 
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8 
输出样例
11
30
35

本题为基础模板题。话不多说,粘上代码

 1 //树状数组基本框架的搭建(维护和查询都是O(lgn)的复杂度) 
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int tree[110000];
 5 int n,m;
 6 
 7 int lowbit(int k)
 8 {
 9     return k&(-k);//把高位的"1"全部去掉 。 
10 }
11 
12 void  add(int k,int num)//在某个位置添加一个值,与他牵连的树状数组的值都要更新 
13 {
14     while(k<=n)
15     {
16        tree[k]+=num;
17        k+=lowbit(k);
18     }
19 } 
20 
21 
22 int Sum(int k)//求数组1~k的和 
23 {
24    int sum=0;
25    while(k>0)
26    {
27       sum+=tree[k];
28       k-=lowbit(k);
29    }
30    return sum;
31 }
32 
33 
34 int main()
35 {
36     cin>>n; cin>>m;
37     int a;
38      for(int i=1;i<=n;i++)
39      {
40              cin>>a;
41              add(i,a);
42     }  
43     int k,x1,x2;
44     for(int i=1;i<=m;i++)
45     {
46        cin>>k>>x1>>x2;
47        if(k==1)
48          add(x1,x2);
49         if(k==0)
50            cout<<Sum(x2)-Sum(x1-1)<<endl;
51     }
52     return 0;
53 }

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值