树状数组

//树状数组
//支持给某位置增加常数与查询前缀和
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[1001],tree[1001];//tree树状数组 
int lowbit(int x)//表示2^k k是二进制数x的末尾0个数
{
    return x&(-x); 
}
int query(int x)
{
    int sum=0;
    int time=lowbit(x);
    for(int i=x;i>0;i-=time)
        sum+=tree[i];
    return sum;
} 
int add(int x,int y)
{
    int time=lowbit(x);
    for(int i=x;i<=n;i+=time)
        tree[i]+=y;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)//初始化1
    {
        cin>>a[i];
        add(i,a[i]);
    }
    //单位置修改+区间求和[L~R]
    {
        add(x,y);
        a[i]=y;
        
        int ans=query(R)-query(L-1);
    }
    for(int i=1;i<=n;i++)//初始化2 
    {
        cin>>a[i];
        add(i,a[i]-a[i-1]);
    }
    //区间修改[L~R]+单位置查询
    {
        add(L,y);
        add(R+1,-y);
        
        int ans=query(x); 
    }
    return 0;
}
原文地址:https://www.cnblogs.com/water-radish/p/9280658.html