树状数组封装
单点修改,区间查询
struct Fenwick {
const int len;
vector<int> a;
Fenwick(int n1) : len(n1), a(len + 1, 0) {}
void init(vector<int>& b) //O(n)初始化
{
for(int i = 1; i <= len; i++)
{
a[i] += b[i];
int j = i + ((i) & (-i));
if(j <= len)
a[j] += a[i];
}
}
void add(int x, int y)
{
for(int i = x; i <= len; i += ((i) & (-i)))
a[i] += y;
}
int sum(int x)
{
int ans = 0;
for(int i = x; i; i -= ((i) & (-i)))
ans += a[i];
return ans;
}
int getsum(int l, int r)
{
return sum(r) - sum(l - 1);
}
};
区间修改,区间查询
struct Fenwick {
const int len;
vector<int> c1,c2;
Fenwick(int n1,vector<int> &a) : len(n1), c1(n1+1,0), c2(n1+1,0) //vector a初始化a为1下标
{
for(int i=1;i<=n1;i++)
add(i,a[i]-a[i-1]);
}
Fenwick(int n1) : len(n1), c1(n1+1,0), c2(n1+1,0){} //初始化0
int lowbit(int x)
{
return ((x)&(-x));
}
void add(int x,int y)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c1[i]+=y;
c2[i]+=x*y;
}
}
int getsum(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
res+=(x+1)*c1[i]-c2[i];
return res;
}
void change(int l,int r,int d) //区间修改:[l,r]+d
{
add(l,d);
add(r+1,-d);
}
int rangesum(int l,int r)//区间查询:[l,r]
{
return getsum(r)-getsum(l-1);
}
};