Luogu P3372 【模板】线段树 1

qwq

#include<cstdio>
using namespace std;
const int maxn = 100005;
int n,m,x,y,flag;
int l[4*maxn],r[4*maxn];
long long lazy[8*maxn],sum[4*maxn];

void build(int L,int R,int now) {
    lazy[now] = 0;
    l[now] = L;
    r[now] = R;
    if(L == R) {
        scanf("%lld",&sum[now]);
        return;
    }
    int mid = (L+R)/2;
    build(L,mid,now*2);
    build(mid+1,R,now*2+1);
    sum[now] = sum[now*2] + sum[now*2+1];
}

long long query(int L,int R,int now) {
    sum[now] += lazy[now] * (r[now] - l[now] + 1);
    lazy[now*2] += lazy[now];
    lazy[now*2+1] += lazy[now];
    lazy[now] = 0;
    if(l[now] == L && r[now] == R)return sum[now];
    int mid = (l[now]+r[now])/2;
    if(R <= mid) return query(L,R,now*2);
    else if(L >= mid+1) return query(L,R,now*2+1);
    else return query(L,mid,now*2)+query(mid+1,R,now*2+1);
}

void modify(int L,int R,long long d,int now){
    if(l[now] == L && r[now] == R) {
        lazy[now] += d;
        return;
    }
    sum[now] += (long long)d*(R-L+1);
    int mid = (l[now]+r[now])/2;
    if(R <= mid) modify(L,R,d,now*2);
    else if(L >= mid+1) modify(L,R,d,now*2+1);
    else {
        modify(L,mid,d,now*2);
        modify(mid+1,R,d,now*2+1);
    }
}

int main() {
    scanf("%d%d",&n,&m);
    build(1,n,1);
    while(m) {
        m--;
        scanf("%d",&flag);
        if(flag == 1) {
            long long k;
            scanf("%d%d%lld",&x,&y,&k);
            modify(x,y,k,1);
        }
        if(flag == 2) {
            scanf("%d%d",&x,&y);
            printf("%lld\n",query(x,y,1));
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/mogeko/p/9996455.html