c是差分数组
a是c的前缀和数组
∑
i
=
1
n
a
[
i
]
∑^n_{i=1}a[i]
∑i=1na[i]=a[1]
+a[2]
+a[3]
+···+a[n]
=c[1]
+c[1]+c[2]
+c[1]+c[2]+c[3]
+···+c[1]+c[2]+···+c[n−1]+c[n]
=n*c[1]
+(n-1)*c[2]
+(n-2)*c[3]
+···+1*c[n]
= ∑ i = 1 n c [ i ] ∗ ( n + 1 − i ) ∑^n_{i=1}c[i]*(n+1-i) ∑i=1nc[i]∗(n+1−i)
= ( n + 1 ) ∗ ∑ i = 1 n c [ i ] − ∑ i = 1 n c [ i ] ∗ i (n+1)*∑^n_{i=1}c[i]-∑^n_{i=1}c[i]*i (n+1)∗∑i=1nc[i]−∑i=1nc[i]∗i
设 c 1 [ i ] = c [ i ] , c 2 [ i ] = c [ i ] ∗ i 设c1[i]=c[i],c2[i]=c[i]*i 设c1[i]=c[i],c2[i]=c[i]∗i
= ( n + 1 ) ∗ ∑ i = 1 n c 1 [ i ] − ∑ i = 1 n c 2 [ i ] (n+1)*∑^n_{i=1}c1[i]-∑^n_{i=1}c2[i] (n+1)∗∑i=1nc1[i]−∑i=1nc2[i]
// 区间修改 update(l,num),update(r+1,-num)
// 区间查询 query(r) - query(l-1)
int query(int num){ //查询
int ans=0,p=num;
while(num>0){
ans+=(p+1)*c1[num]-c2[num];
num-=lowbit(num);
}
return ans;
}
void update(int num,int val){ //更新
int p=num;
while(num<=n){
c1[num]+=val;
c2[num]+=val*p
num+=lowbit(num);
}
}