树状数组的基本运用

来源:互联网 发布:国产电视知乎 编辑:程序博客网 时间:2024/05/22 11:54
问题描述

给定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  51 2 3 4 5 6 7 8 9 10 1 1 50 1 30 4 81 7 50 4 8 
输出样例
113035

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

 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 }

 




原创粉丝点击