题解 | 【模板】线段树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; // 返回前缀和
}
}