区间求和,区间修改,单点更新
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
int tree[MAXN << 2];
int add[MAXN << 2];
int a[MAXN << 2];
int n;
void build(int p, int l, int r)
{
if(l == r){
tree[p] = a[l];//这里 a数组可以省去
return;
}
int m = (l+r)>>1;
build(p<<1,l,m);
build(p<<1|1,m+1,r);
tree[p] = tree[p<<1] + tree[p<<1|1];
}
void updateOne(int p, int l, int r, int ind, int x)
{
if(l == r){
tree[p] += x;
return;
}
int m = (l+r)>>1;
if(ind <= m)
updateOne(p<<1,l,m,ind,x);
else
updateOne(p<<1|1,m+1,r,ind,x);
tree[p] = tree[p<<1] + tree[p<<1|1];
}
void pushDown(int p, int ln, int rn)
{
if(add[p]){
add[p<<1] += add[p];
add[p<<1|1] += add[p];
tree[p<<1] += add[p]*ln;
tree[p<<1|1] += add[p]*rn;
add[p] = 0; //清除本节点标记
}
}
void updateSome(int p, int l, int r, int tl, int tr,int x)
{
if(tl <= l && tr >= r){
tree[p] += x*(r-l+1);
add[p] += x;
return;
}
int m = (l+r)>>1;
pushDown(p,m-l+1,r-m);
if(tl <= m)
updateAll(p<<1,l,m,tl,tr,x);
if(tr > m)
updateAll(p<<1|1,m+1,r,tl,tr,x);
tree[p] = tree[p<<1] + tree[p<<1|1];
}
int query(int p, int l, int r, int tl, int tr)
{
if(l >= tl && r <= tr){
return tree[p];
}
int m = (l+r)>>1;
int ans = 0;
if(tl <= m)
ans += query(p<<1,l,m,tl,tr);
if(tr > m)
ans += query(p<<1|1,m+1,r,tl,tr);
return ans;
}