题目大意:单点修改,求前缀和的前缀和
题解:树状数组实现区间修改的思路
SSt=∑i=1tai∗i=∑i=1tai∗(n−i+1)−(n−t)∑i=1tai
维护两个前缀和, ∑(n−i+1)ai 和 ∑ai
我的收获:推式子……
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const int M=100005;
int n,m;
int a[M];
ll c[2][M];
void modify(int f,int x,ll val){for(int i=x;i<=n;i+=i&(-i)) c[f][i]+=val;}
ll query(int f,int x){ll tmp=0;for(int i=x;i>0;i-=i&(-i)) tmp+=c[f][i];return tmp;}
void work()
{
char opt[10];int x,y;
for(int i=1;i<=m;i++){
scanf("%s",opt);
if(opt[0]=='Q') scanf("%d",&x),printf("%lld\n",query(1,x)-query(0,x)*(n-x));
else scanf("%d%d",&x,&y),modify(0,x,y-a[x]),modify(1,x,(ll)(n-x+1)*(y-a[x])),a[x]=y;
}
}
void init()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
modify(0,i,a[i]);
modify(1,i,(ll)(n-i+1)*a[i]);
}
}
int main()
{
init();
work();
return 0;
}