码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组

时间:2016-05-06 00:11:05      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

/*
树状数组前缀和
虽然只资词单点修改 区间查询 但是好写
 pos&(-pos) 很神奇的东西 求前缀和
 负数的二进制表示用补码(对应整数的反码+1) 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int tree[100010],n,m;
void Add(int pos,int data)
{
    while(pos<=n)
      {
          tree[pos]+=data;
          pos+=pos&(-pos);
      }
}
int find(int pos)
{
    int sum=0;
    while(pos)
      {
          sum=sum+tree[pos];
          pos-=pos&(-pos);
      }
    return sum;
}
int main()
{
    cin>>n;
    int i,x,y,z;
    for(i=1;i<=n;i++)
      {
          cin>>x;
        Add(i,x);
      }
    cin>>m;
    for(i=1;i<=m;i++)
      {
          cin>>x>>y>>z;
          if(x==1)Add(y,z);
          else cout<<find(z)-find(y-1)<<endl;
      }
    return 0;
}

 

树状数组

标签:

原文地址:http://www.cnblogs.com/yanlifneg/p/5463535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!