区区区间

区区区间

https://ac.nowcoder.com/acm/problem/200195

#include<iostream>
#include<algorithm>
using namespace std;
#define lson o << 1, l, M
#define rson o << 1 | 1, M+1, r
#define lo o << 1
#define ro o << 1 | 1
const int N = 2e5 + 10;
long long v[N << 2], lazy[N << 2];
inline void pushup(int o) {
    v[o] = v[o << 1] + v[o << 1 | 1];
}
inline long long cal(long long a0, long long n) {
    return a0 * n + (n - 1) * n / 2;
}
inline void pushdown(int o, int ln, int rn) {
    if(lazy[o]) {
        lazy[lo] = lazy[o];
        lazy[ro] = lazy[o] + ln;
        v[lo] = cal(lazy[o], ln);
        v[ro] = cal(lazy[ro], rn);
        lazy[o] = 0;
    }
}
void Build(int o, int l, int r) {
    if(l == r) {
        scanf("%lld", &v[o]);
        return ;
    }
    int M = (l + r) / 2;
    Build(lson);
    Build(rson);
    pushup(o);
}
void update(int L, int R, long long k, int o, int l, int r) {
    if(L <= l) {
        if(R >= r) {
            long long C = k + (l - L);
            v[o] = cal(C, r - l + 1);
            lazy[o] = C;
            return ;
        }
    }
    int M = (l + r) / 2;
    pushdown(o, M - l + 1, r - M);
    if(L <= M)
        update(L, R, k, lson);
    if(R > M)
        update(L, R, k, rson);
    pushup(o);
}
long long query(int L, int R, int o, int l, int r) {
    if(L <= l) {
        if(R >= r)
            return v[o];
    }
    int M = (l + r) / 2;
    pushdown(o, M - l + 1, r - M);
    long long Sum = 0;
    if(L <= M)
        Sum += query(L, R, lson);
    if(R > M)
        Sum += query(L, R, rson);
    return Sum;
}
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    Build(1, 1, n);
    int op, l, r;
    long long k;
    while(m--) {
        scanf("%d%d%d", &op, &l, &r);
        if(op == 1) {
            scanf("%lld", &k);
            update(l, r, k, 1, 1, n);
        } else
            printf("%lld\n", query(l, r, 1, 1, n));
    }
    return 0;
}
全部评论

相关推荐

牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务