70分救助,鬼知道我交了多少次......
查看原帖
70分救助,鬼知道我交了多少次......
291939
lihuazou楼主2020/6/6 02:50
//我感觉思路应该没问题,和题解一样,但就是WA..
#include<cstdio>
#include<iostream>

using namespace std;

typedef long long ll;

const ll MAX_SIZE = 1e5 + 10;

ll bit[MAX_SIZE], bits[MAX_SIZE];
int n, m;
int a[MAX_SIZE], sum[MAX_SIZE];

int lowbit(int x) {
    return x & -x;
}

void add(ll bit[], int x, int y) {
    while (x <= n) {
        bit[x] += y;
        x += lowbit(x);
    }
}

ll ask(ll bit[], int x) {
    ll ans = 0;
    while (x) {
        ans += bit[x];
        x -= lowbit(x);
    }
    return ans;
}

void add_interval(int l, int k) {
    add(bit, l, k);
    add(bits, l, (l - 1) * k);
}

ll query(int x) {
    return ask(bit, x) * x - ask(bits, x);
}

ll query_interval(int l, int r) {
    return query(r) - query(l - 1);
}

int main() {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        sum[i] = a[i] + sum[i - 1];
        add_interval(i,a[i]);
    }
    while (m--) {
        char c[10];
        getchar();
        scanf("%s", &c);
        if (c[0] == 'M') {
            int l, k;
            scanf("%d %d", &l, &k);   
            add_interval(l, k - a[l]);
            a[l] = k;
        }
        else {
            int top;
            scanf("%d", &top);
            ll ans = query_interval(1, top);
            printf("%lld\n", ans);
        }

    }
    return 0;
}
2020/6/6 02:50
加载中...