树状数组
单点修改区间查询
int b[manx];
int lowbit(int x)
{
return x & ( -x);
}
void add(int x,int c){
while(x <= n){
b[x] += c;
x += lowbit(x);
}
}
int query(int x){
int res = 0;
while(x){
res += b[x];
x -=lowbit(x);
}
}
2,区间修改,单点查询
int b[maxn],num[maxn]; //b表是差分数组,num保存数据
for(int i = 1;i < n;i++){
cin>>num[i];
}
num[0] = b[0] = 0;
for(int i = 1;i < n;i++){
add(b,i,num[i] - num[i - 1]);
}
void add(int a[],intx,int c){
while(x <= n){
a[x] += c;
x += lowbie(x);
}
}
int query(int a[],int x){
int res = 0;
while(x){
res += a[x];
x -= lowbit(x);
}
return res;
}
ans = query(b,x);
区间修改,区间访问
//修改
add(c1,l,c);
add(c1,r + 1,-c);
add(c2,l,c * l);
add(c2,r + 1,-c * (r + 1));
//访问
int sum1 = query(c1,l - 1) * l - query(c2,l - 1);
int sum2 = query(c1,r) * (r + 1) - query(c2,r);
cout<<sum2 - sum1<<endl;