这题目名字挺有意思= =
SSt=∑ti=1ai∗i=∑ti=1ai∗(n−i+1)−(n−t)∑ti=1ai
维护两个前缀和,
∑(n−i+1)ai
和
∑ai
,然后直接查询、修改即可。
时间复杂度
O(nlogn)
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define lowbit(x) (x & (-x))
#define maxn 100007
inline int rd() {
char c = getchar();
while (!isdigit(c)) c = getchar() ; int x = c - '0';
while (isdigit(c = getchar())) x = x * 10 + c - '0';
return x;
}
typedef long long ll;
int n , m;
ll a[maxn];
struct BITS {
ll val[maxn];
void add(int x , ll v) {
while (x <= n)
val[x] += v , x += lowbit(x);
}
ll sum(int x) {
ll t = 0;
while (x)
t += val[x] , x -= lowbit(x);
return t;
}
}s1 , s2;
void input() {
n = rd() , m = rd();
rep (i , 1 , n) {
a[i] = rd();
s1.add(i , a[i]);
s2.add(i , (ll) (n - i + 1) * a[i]);
}
}
void solve() {
char cmd[10];
rep (i , 1 , m) {
scanf("%s" , cmd);
int t = rd();
if (cmd[0] == 'Q') {
printf("%lld\n" , s2.sum(t) - (n - t) * s1.sum(t));
}
else {
int v = rd() - a[t];
s1.add(t , v) , s2.add(t , (ll) (n - t + 1) * v);
a[t] += v;
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("data.txt" , "r" , stdin);
#endif
input();
solve();
return 0;
}