题解 | 【模板】线段树1

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息

public class Main {

    static int N = 100001; // 定义树状数组的最大长度

    static long[] fenwickTree = new long[N]; // 用于存储树状数组的数据

    static long[] arr = new long[N]; // 原始数组,用于存储输入数据

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int n = in.nextInt(); // 读取数组的长度

        int q = in.nextInt(); // 读取查询的数量

        // 初始化数组并更新树状数组

        for (int i = 1; i <= n; i++) {

            arr[i] = in.nextLong(); // 读取原始数组中的值

            add(i, arr[i]); // 将值添加到树状数组中

        }

        StringBuilder s = new StringBuilder(); // 用于存储查询结果

        for (int i = 0; i < q; i++) {

            int x = in.nextInt(); // 读取操作类型

            if (x == 1) {

                int ai = in.nextInt(); // 读取要更新的索引

                long k = in.nextLong(); // 读取要增加的值

                long delta = k; // 计算变化量

                arr[ai] += delta; // 更新原始数组

                add(ai, delta); // 更新树状数组

            } else {

                int l = in.nextInt(); // 读取区间左端点

                int r = in.nextInt(); // 读取区间右端点

                s.append(sum(r) - sum(l -

                                      1)).append('\n'); // 计算区间和并添加到结果中

            }

        }

        System.out.print(s); // 输出所有查询结果

    }

    // 单点更新:将索引 i 处的值增加 delta

    public static void add(int i, long delta) {

        while (i < N) {

            fenwickTree[i] += delta; // 更新当前节点的值

            i += i & -i; // 移动到父节点

        }

    }

    // 前缀和查询:返回从 1 到 i 的累加和

    public static long sum(int i) {

        long res = 0;

        while (i > 0) {

            res += fenwickTree[i]; // 累加当前节点的值

            i -= i & -i; // 移动到子节点

        }

        return res; // 返回前缀和

    }

}

全部评论

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务