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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
using namespace std; typedef long long ll; ll tag[400010], sum[400010]; int a[400010]; inline void (int x, int l, int r) { if(tag[x] == 0) return; int mid = l + r >> 1; sum[x << 1] = sum[x << 1] + tag[x] * (mid - l + 1); sum[x << 1 | 1] = sum[x << 1 | 1] + tag[x] * (r - mid); tag[x << 1] += tag[x]; tag[x << 1 | 1] += tag[x]; tag[x] = 0; } inline void up(int x) { sum[x] = sum[x << 1] + sum[x << 1 | 1]; } inline void add(int x, int l, int r, int L, int R, ll k) { if(l > R || L > r) return; if(L <= l && r <= R) { tag[x] += k; sum[x] += 1ll * k * (r - l + 1); return; } int mid = l + r >> 1; down(x, l, r); add(x << 1, l, mid, L, R, k); add(x << 1 | 1, mid + 1, r, L, R, k); up(x); } inline ll get_sum(int x, int l, int r, int L, int R) { if(l > R || L > r) return 0; if(L <= l && r <= R) return sum[x]; int mid = l + r >> 1; down(x, l, r); return get_sum(x << 1, l, mid, L, R) + get_sum(x << 1 | 1, mid + 1, r, L, R); } int n, m; char s[10]; int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) scanf("%d", a + i); for(int i = 1; i <= n; i++) add(1, 1, n, i, n, a[i]); for(int i = 1; i <= m; i++) { scanf("%s", s); if(s[0] == 'M') { int x, y; scanf("%d%d", &x, &y); add(1, 1, n, x, n, y - a[x]); a[x] = y; } else { int x; scanf("%d", &x); printf("%lldn", get_sum(1, 1, n, 1, x)); } } return 0; }
|
近期评论