1 条题解

  • 0
    @ 2025-6-14 9:53:12

    树状数组不用来维护原数组,而是维护差分数组,来实现区间修改,单点查询。

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 500000;
    int n, m;
    int a[MAXN + 5];
    int t[MAXN + 5];
    int lowbit(int x)
    {
        return x & (-x);
    }
    // 第x个数加k
    void update(int x, int k)
    {
        for (int i = x; i <= n; i += lowbit(i))
            t[i] += k;
    }
    // 返回前x个数的和
    int query(int x)
    {
        int res = 0;
        for (int i = x; i >= 1; i -= lowbit(i))
            res += t[i];
        return res;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
            if (i == 1)
                update(i, a[i]);
            else
                update(i, a[i] - a[i - 1]);
        }
        while (m--)
        {
            int op, x, y, k;
            cin >> op;
            if (op == 1)
            {
                cin >> x >> y >> k; // a[x]~a[y] +=y
                update(x, k);
                update(y + 1, -k);
            }
            else
            {
                cin >> x; // cout a[x]
                cout<<query(x)<<"\n";
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    3620
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    5
    已通过
    5
    上传者