树状数组

#include<iostream>
using namespace std;
const int N=100010;
int a[N],tr[N];//树状数组表示的是(N-2^k,N]的和(k的含义与下面相同),可通过递归,将树状数组转化为前缀和数组
int n,m;
int lowbit(int x)//lowbit返回的是2的k次方,k为x二进制表示末尾连续0的个数。
{
    return x&-x;
}
int query(int x)
{
    int res=0;
    for(int j=x;j;j-=lowbit(j))
    {
        res+=tr[j];
    }
    return res;
}
void add(int st,int x)
{
    for(int j=st;j<=n;j+=lowbit(j))
    {
        tr[j]+=x;
    }
}
int main()
{
   
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        add(i,a[i]);
    }
    while(m--)
    {
        int q,k,p;
        cin>>k>>q>>p;
        if(k==0){
            cout<<query(p)-query(q-1)<<endl;
    }
        else {
            add(q,p);
        }
    }
}
树状数组的下标一定要从1开始。
树状数组的层数是根据数字二进制表示下末尾有几个零来的,有几个零就是第几层。
全部评论

相关推荐

产品经理傅立叶:1.建议把个人信息码一下 2.简历的排版还得优化一下,看上去有点乱,另外有一个实习经历实习时间好像多写了一个; 3.实习产出要量化
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务