操作:1.给定l, r,计算数组在区间(l,r)的和。 2.给定i和x,执行ai += x;
struct node {
int l, r, q;
}T[4 * maxn];
void built(int l, int r, int q) { //建立线段树,built(1, n, 1);
T[q].l = l;
T[q].r = r;
if(l == r) {
T[q].k = a[l];
return ;
}
int mid = (l + r) / 2;
built(l, mid, q * 2);
built(mid + l, r, q * 2 + 1);
T[q].k = T[q * 2].k + T[q * 2 + 1].k;
}
void insert(int a, int b, int q) { //在第a位增加b,insert(a, b, 1);
if(T[q].l == T[q].r) {
T[q].k += b;
return ;
}
int mid = (T[q].l + T[q].r) / 2;
if(a <= mid) insert(a, b, q * 2 + 1);
else T[q].k = T[2 * q].k + T[2 * q + 1].k;
}
int query(int l, int r, int q) { //查询(l, r)区间内数组的和,query(1, n, 1);
if(l <= T[q].l && T[q].r <= r) {
return T[q].k;
}
int mid = (T[q].l + T[q].r) / 2;
if(r <= mid) return query(l, mid, 2 * q);
if(l > mid) return query(mid + 1, r, 2 * q + 1);
return query(l, mid, 2 * q) + query(mid + 1, r, 2 * q + 1);
}