摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 失误原因(初次提交分数)
线段树练习 ★☆☆☆☆ 答案正确 100 2015-2-4 17:10:36 数组不够大(90)

题意

数据结构,支持区间修改和求和。

题解

代码

1080.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. template<size_t N,typename T=int>
  6. class BIT
  7. {
  8. private:
  9. T bit[N];
  10. const int Lowbit(const int &x)
  11. {
  12. return x&(-x);
  13. }
  14. public:
  15. size_t n;
  16. T a[N];
  17. void Build()
  18. {
  19. for(int i=1;i<=n;++i)
  20. {
  21. bit[i]=a[i];
  22. for(int j=i-1;j>i-Lowbit(i);j-=Lowbit(j))
  23. bit[i]+=bit[j];
  24. }
  25. }
  26. void Update(const int i,const int _delta)
  27. {
  28. a[i]+=_delta;
  29. for(int j=i;j<=n;j+=Lowbit(j))
  30. bit[j]+=_delta;
  31. }
  32. const T GetSum(const int &k)
  33. {
  34. T ans(0);
  35. for(int i=k;i>0;i-=Lowbit(i))
  36. {
  37. ans+=bit[i];
  38. }
  39. return ans;
  40. }
  41. const T GetSum(const int &l,const int &r)
  42. {
  43. return GetSum(r)-GetSum(l-1);
  44. }
  45. };
  46. BIT<1000000,int> bit;
  47. int main()
  48. {
  49. scanf("%d",&bit.n);
  50. for(int i=1;i<=bit.n;++i)
  51. {
  52. scanf("%d",&bit.a[i]);
  53. }
  54. bit.Build();
  55. int m;
  56. scanf("%d",&m);
  57. for(int i=1,a,b,c;i<=m;++i)
  58. {
  59. scanf("%d%d%d",&a,&b,&c);
  60. if(a==1)
  61. {
  62. bit.Update(b,c);
  63. }
  64. else
  65. {
  66. printf("%d\n",bit.GetSum(b,c));
  67. }
  68. }
  69. }

著作权声明[编辑]

关于[编辑]