问题描述
输入
输出
输入样列
输出样例
给定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 }