树状数组

· · 个人记录

你可以通过 TA\_T 更改树状数组维护的基本类型。

#define TA_T int

上面的基础类型是 \text{int}

变量

底层操作

普通操作


#define TA_T int
struct Tree_Array{
    int n;
    TA_T a[N];
    int lowbit(int x){
        return x&-x;
    }
    void clear(TA_T p){
        n=0;
        memset(a,p,sizeof(a));
    }
    TA_T op(TA_T x,TA_T y){
        return x+y;
    }
    void init(int m,TA_T *b){
        n=m;
        for(int i=n;i;i--){
            a[i]=b[i];
            if(i+lowbit(i)<=n)
                a[i+lowbit(i)]=op(a[i+lowbit(i)],a[i]);
        }
    }
    void change(int x,TA_T val){
        for(;x<=n;x+=lowbit(x))
            a[x]=op(a[x],val);
    }
    TA_T ask(int x){
        TA_T ans=p;
        while(x){
            ans=op(ans,c[x]);
            x-=lowbit(x);
        }
        return ans;
    }