以下所有数据整理来自于此
单点修改,查询前缀和
void add(int x,int k)
{
for(;x<=n;x+=x&-x)t[x]+=k;
}
int ask(int k){
int ans = 0;
for(:x:x-=x&-x)ans+=t[x];
return ans;
}
单点修改,单点查询
void add(int x,int k)
{
for(;x<=n;x+=x&-x)t[x]+=k;
}
int ask(int k){
int ans = 0;
for(:x:x-=x&-x)ans+=t[x];
return ans;
}
add(x,k);
ask(x)-ask(x-1);
单点修改,区间查询
void add(int x,int k)
{
for(;x<=n;x+=x&-x)t[x]+=k;
}
int ask(int k){
int ans = 0;
for(:x:x-=x&-x)ans+=t[x];
return ans;
}
add(x,k);
ask(r)-ask(l-1);
区间修改,单点查询
void add(int x,int k)
{
for(;x<=n;x+=x&-x)t[x]+=k;
}
int ask(int k){
int ans = 0;
for(:x:x-=x&-x)ans+=t[x];
return ans;
}
add(l,d);add(r+1,-d);
a[x]+ask(x);//原数值加增量
区间修改区间查询
int t1[maxn],t2[maxn];
void add1(int x;int k){
for(;x<=n;x+=x&-x)t1[x]+=k;
}
int ask1(int x){
int ans=0;
for(;x;x-=x&-x)ans+=t1[x];
return ans;
}
void add2(int x;int k){
for(;x<=n;x+=x&-x)t2[x]+=k;
}
int ask2(int x){
int ans=0;
for(;x;x-=x&-x)ans+=t2[x];
return ans
}
add1(l,d);
add1(r+1,-d);
add2(l,l*d);add2(r+1),-(r+1)*d);
(sum[r]+(r+1)*ask1(r)-ask2(r))-(sum[l-1]+l*ask1(l-1)-ask2(l-1))-