树状数组
//树状数组 //支持给某位置增加常数与查询前缀和 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n,a[1001],tree[1001];//tree树状数组 int lowbit(int x)//表示2^k k是二进制数x的末尾0个数 { return x&(-x); } int query(int x) { int sum=0; int time=lowbit(x); for(int i=x;i>0;i-=time) sum+=tree[i]; return sum; } int add(int x,int y) { int time=lowbit(x); for(int i=x;i<=n;i+=time) tree[i]+=y; } int main() { cin>>n; for(int i=1;i<=n;i++)//初始化1 { cin>>a[i]; add(i,a[i]); } //单位置修改+区间求和[L~R] { add(x,y); a[i]=y; int ans=query(R)-query(L-1); } for(int i=1;i<=n;i++)//初始化2 { cin>>a[i]; add(i,a[i]-a[i-1]); } //区间修改[L~R]+单位置查询 { add(L,y); add(R+1,-y); int ans=query(x); } return 0; }