树状数组的区间修改
原始的树状数组只能单点更新,区间查询。
运用差分的思想引入差分数组,从而实现区间修改。
c[i]为原始的树状数组,d[i]为差分的树状数组
#include<bits/stdc++.h> using namespace std; int c[100010],d[100010],n,m; int lowbit(int i) { return i&(-i); } void update(int x,int y) { for(int i = x;i<=n;i+=lowbit(i)) { c[i]+=y; d[i]+=(x-1)*y; } } int getsum(int x) { int sum = 0; for(int i = x;i>0;i-=lowbit(i)) { sum+=x*c[i]-d[i]; } return sum; } int main() { int t,l,r,v; cin>>n>>m; for(int i = 1;i<=n;i++)//初始化 { cin>>t; update(i,t); update(i+1,-v); } while(m--)//m个询问 { cin>>t; if(t)//t等于1时区间修改 { cin>>l>>r>>v; update(l,v); update(r+1,-v); } else { cin>>l>>r; cout<<getsum(r)-getsum(l-1)<<endl; } } return 0; }