bzoj3155: Preprefix sum
是很像树上操作的那题的。
不写了。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; int n,m; LL s[2][110000]; int lowbit(int x){return x&-x;} void change(int w,int x,LL k) { while(x<=n) { s[w][x]+=k; x+=lowbit(x); } } LL getsum(int w,int x) { LL ret=0; while(x>=1) { ret+=s[w][x]; x-=lowbit(x); } return ret; } LL a[110000]; char ss[20]; int main() { scanf("%d%d",&n,&m); LL sum=0; for(int i=1;i<=n;i++) { scanf("%lld",&a[i]);sum+=a[i]; change(0,i,sum); } int x;LL k; while(m--) { scanf("%s",ss+1); if(ss[1]=='Q') { scanf("%d",&x); printf("%lld\n",getsum(1,x)*x+getsum(0,x)); } else { scanf("%d%lld",&x,&k); change(0,x, -LL((x-1)*(k-a[x])) ); change(1,x,k-a[x]); a[x]=k; } } return 0; }
pain and happy in the cruel world.