题意:求前缀和的前缀和,并有修改值操作。
Si = S(i-1) + a[x]变为Si = S(i-1) +y。 修改值就是y - a[x]
这里每个a[i]的值就是差分数组,一个树状数组维护就行。
S1+S2+S3+....+Si
=a1+a1+a2+a1+a2+a3+.....+a1+a2+...+ai
=a1*i+a2*(i-1)+...+ai
=i*(a1+a2+...+ai) - (a2+a3*2+...+(i-1)*ai)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll c[100005],c2[100005];
ll a[100005];
ll n,m;
#define lowbit(x) x&-x
void update(ll pos,ll x)
{
for(register int i=pos;i<=n;i+=lowbit(i))
c[i]+=x,c2[i]+=(pos-1)*x;
}
ll getsum(ll pos)
{
register ll res=0;
for(register int i=pos;i;i-=lowbit(i))
res+=c[i]*(pos)-c2[i];
return res;
}
int main()
{
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++){
cin>>a[i];
update(i,a[i]);
}
ll y,x;
while(m--){
string s;
cin>>s;
if(s[0]=='Q'){
cin>>x;
printf("%lld\n",getsum(x));
}else {
cin>>x>>y;
update(x,y-a[x]);
a[x] = y;
}
}
return 0;
}