acwing 243. 一个简单的整数问题2(树状数组区间修改、区间求和)

题意

在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;

#define ls (k << 1)
#define rs (k << 1 | 1)
#define ll long long
const int N = 1e5 + 10;
int n, m;
int a[N];
struct Tree
{
    
    
    int l, r; ll sum, add;
} tr[N * 4];

void push_up(int k)
{
    
    
    tr[k].sum = tr[ls].sum + tr[rs].sum;
}

void push_down(int k)
{
    
    
    if (tr[k].add)
    {
    
    
        Tree & root = tr[k], & left = tr[ls], & right = tr[rs];
        left.add += root.add, left.sum += 1LL * (left.r - left.l + 1) * root.add;
        right.add += root.add, right.sum += 1LL * (right.r - right.l + 1) * root.add;
        root.add = 0;
    }
}

void build(int k, int l, int r)
{
    
    
    tr[k] = {
    
     l, r };
    if (l == r)
    {
    
    
        tr[k] = {
    
     l, r, a[l], 0 };
        return;
    }

    int md = (l + r) >> 1;
    build(ls, l, md);
    build(rs, md + 1, r);
    push_up(k);
}

void modify(int k, int l, int r, int d)
{
    
    
    if (tr[k].l >= l && tr[k].r <= r)
    {
    
    
        tr[k].sum += 1LL * (tr[k].r - tr[k].l + 1) * d;
        tr[k].add += d;
        return;
    }

    push_down(k);
    int md = (tr[k].l + tr[k].r) >> 1;
    if (l <= md) modify(ls, l, r, d);
    if (r >  md) modify(rs, l, r, d);
    push_up(k);
}

ll query(int k, int l, int r)
{
    
    
    if (tr[k].l >= l && tr[k].r <= r) return tr[k].sum;

    push_down(k);
    int md = (tr[k].l + tr[k].r) >> 1;
    ll sum = 0;
    if (l <= md) sum += query(ls, l, r);
    if (r >  md) sum += query(rs, l, r);
    return sum;
}


int main()
{
    
    
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
    build(1, 1, n);
    char op[2]; int l, r, d;
    while (m --)
    {
    
    
        scanf("%s %d %d", op, &l, &r);
        if (op[0] == 'C')
        {
    
    
            scanf("%d", &d);
            modify(1, l, r, d);
        }
        else
        {
    
    
            printf("%lld\n", query(1, l, r));
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34261446/article/details/121144921