题目传送门。
思路
这一道题一看又有修改又有求和,普通的做法肯定过不了,这时我们就要请出可以修改和求和的工具,线段树和树状数组。由于作者比较懒,所以就只写出了树状数组的写法。
AC CODE
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
| #include<bits/stdc++.h> using namespace std; int n,m; int a[200005],c[200005]; int lowbit(int x){return x&(-x);} void add(int x,int y){ for(int i=x;i<=n;i+=lowbit(i)){ c[i]+=y; } } int sum(int x){ int cnt=0; for(int i=x;i>=1;i-=lowbit(i))cnt+=c[i]; return cnt; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; add(i,a[i]); } while(m--){ int op; cin>>op; if(op==1){ int x; cin>>x; int t=sum(x+1)-2*sum(x)+sum(x-1); add(x,t); add(x+1,-t); } else{ int l,r; cin>>l>>r; cout<<sum(r)-sum(l-1)<<'\n'; } } return 0; }
|
管理大大求过。