看起来实际上也挺好做的,就是只要把树状数组维护的对象改成原序列的差分数组即可。这样每次树状数组所谓的query求1到n的前缀和也就变成了就单点n的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include<iostream> #include<cstring> using namespace std; struct BTA{//Update Section,Query Single Point const static int MAX=500000; int C[MAX+5]; BTA(){ memset(C,0,sizeof(C)); } int lowbit(int i){ return i&(-i); } int query(int x){ int sum=0; while(x>0){ sum+=C[x]; x-=lowbit(x); } return sum; } void update(int i,int v){ while(i<=MAX){ C[i]+=v; i+=lowbit(i); } } void updateSection(int l,int r,int v){ update(l,v); update(r+1,-v); } }TA; int n,m; int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ int v; cin>>v; TA.updateSection(i,i,v); } for(int i=1;i<=m;i++){ int op,v1,v2,v3; cin>>op; if(op==1){ cin>>v1>>v2>>v3; TA.updateSection(v1,v2,v3); } else{ cin>>v1; cout<<TA.query(v1)<<endl; } } } |