快速求单点修改,区间求和;
或者可以求区间修改,单点求值,只需树状数组维护原数组的查分数组即可。
单点修改,区间求和:
#include<bits/stdc++.h> using namespace std; int n,m,c[500010]={}; int lowbit(int x){ return x&-x; } void f1(int x,int k){ for(;x<=n;x+=lowbit(x)) c[x]+=k; } int f2(int x){ int ans=0; for(;x;x-=lowbit(x)) ans+=c[x]; return ans; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ int a; cin>>a; f1(i,a); } for(int i=1;i<=m;i++){ int opt; cin>>opt; if(opt==1) { int a,b; cin>>a>>b; f1(a,b); } else { int x,y; cin>>x>>y; cout<<f2(y)-f2(x-1)<<endl; } } return 0; }