【模板】树状数组

int n;
const int maxn = 100010;
int a[maxn];
int sum1[maxn];
int sum2[maxn];

inline int lowbit(int x)
{
    return x & (-x);
}

inline void updata(int i, int k)
{
    int x = i;
    while (i <= n)
    {
        sum1[i] += k;
        sum2[i] += k * (x - 1);
        i += lowbit(i);
    }
}

inline int get_sum(int i)
{
    int res = 0;
    int x = i;
    while (i > 0)
    {
        res += x * sum1[i] - sum2[i];
        i -= lowbit(i);
    }
    return res;
}

int main()
{
    //输入n
    for (int i = 1; i <= n; i++)
    {
        //输入a[i]
        updata(i, a[i] - a[i - 1]);
    }
    int l, r, t;
    //输入l,r,t
    //[l,r]区间加t
    updata(l, t);
    updata(r + 1, t);
    //输入l,r
    int sum;
    //询问[l,r]区间和
    sum = get_sum(r) - get_sum(l - 1);
}

 

posted on 2019-10-11 13:30  thjkhdf12  阅读(128)  评论(0)    收藏  举报