求助qaq
查看原帖
求助qaq
131273
FallacyMaker楼主2021/9/17 15:17

样例第三个过不去,找问题找的头晕..

#include<cstdio>
#define lson rt<<1
#define rson rt<<1|1

const int N=1e5+10;
int n, m;
long long seg[N<<2],tag[N<<2];

void build(int rt, int l, int r) {
    if (l==r) {
        scanf("%lld", &seg[rt]);
        return;
    }
    int mid=(l+r)>>1;
    build(lson,l,mid);
    build(rson,mid+1,r);
    seg[rt]=seg[lson]+seg[rson];
}
inline void f(int rt, int k, int l, int r) {
    seg[rt]+=1LL*k*(r-l+1);
    tag[rt]+=k;
}
inline void PushDown(int rt, int l, int r) {
    if (tag[rt]==0) return; //卡,都能卡
    int mid=(l+r)>>1;
    f(lson,l,mid,tag[rt]);
    f(rson,mid+1,r,tag[rt]);
    tag[rt]=0;
}

void modify(int x, int y, int k, int rt, int l, int r) {
    if (x<=l && r<=y) {
        f(rt, k, l, r);
        return;
    }
    PushDown(rt,l,r);
    int mid=(l+r)>>1;
    if (x<=mid) modify(x,y,k,lson,l,mid);
    if (y>mid) modify(x,y,k,rson,mid+1,r);
    seg[rt]=seg[lson]+seg[rson];
}

long long query(int x, int y, int rt, int l, int r) {
    if (x<=l && r<=y) return seg[rt];
    PushDown(rt,l,r);
    int mid=(l+r)>>1;
    long long ans = 0;
    if (x<=mid) ans+=query(x,y,lson,l,mid);
    if (y>mid) ans+=query(x,y,rson,mid+1,r);
    return ans;
}

int main() {
    int x, y, opt, k;
    scanf("%d%d", &n, &m);
    build(1,1,n);
    while (m--) {
        scanf("%d%d%d", &opt, &x, &y);
        if (opt==1) {
            scanf("%d", &k);
            modify(x,y,k,1,1,n);
        }
        else printf("%lld\n", query(x,y,1,1,n));
    }
}
2021/9/17 15:17
加载中...