const int maxn=3e3+10;
//const int inf=1e9+10;
int tree[maxn<<2];
int arr[maxn];
int lazy[maxn<<2];
void build_tree(int node,int st,int ed){
if(st==ed){
tree[node]=arr[st];
return;
}
int mid=(st+ed)/2;
build_tree(node*2,st,mid);
build_tree(node*2+1,mid+1,ed);
tree[node]=tree[node*2]+tree[node*2+1];
}// 建树
void update(int node,int st,int ed,int idx,int val){
//idx是arr中要改的值的对应坐标,val是要改成的值
if(st==ed){
arr[idx]+=val;
tree[node]=arr[idx];//*注意是node*
return;
}
int mid=(st+ed)/2;
if(idx>=st&&idx<=mid){
update(node*2, st, mid, idx, val);
}
else {
update(node*2+1, mid+1, ed, idx, val);
}
tree[node]=tree[node*2]+tree[node*2+1];
}//单点修改
int query(int node,int st,int ed,int L,int R){
if(L>ed||R<st)return 0;
if(st>=L&&ed<=R)return tree[node];
int mid=(st+ed)/2;
return query(node*2,st,mid,L,R)+query(node*2+1, mid+1, ed, L, R);
}//区间求和
void push_down(int node,int st,int ed){
if(lazy[node]==0)return;
int mid=(st+ed)/2;
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
tree[node*2]+=(mid-st+1)*lazy[node];
tree[node*2+1]+=(ed-mid)*lazy[node];
lazy[node]=0;
}
//lazy下放
void update(int node,int st,int ed,int L,int R,int val){
//L和R是要修改的区间
if(L<=st&&R>=ed){
lazy[node]+=val;
tree[node]+=val*(R-L+1);
return;
}
int mid=(st+ed)/2;
push_down(node, st, ed);
if(L<=mid){
update(node*2,st,mid,L,R,val);
}
if(R>mid) {
update(node*2+1,mid+1,ed,L,R,val);
}
tree[node]=tree[node*2]+tree[node*2+1];
}//区间修改
const int maxn=3e3+10;
//const int inf=1e9+10;
int tree[maxn<<2];
int arr[maxn];
int lazy[maxn<<2];
void build_tree(int node,int st,int ed){
if(st==ed){
tree[node]=arr[st];
return;
}
int mid=(st+ed)/2;
build_tree(node*2,st,mid);
build_tree(node*2+1,mid+1,ed);
tree[node]=tree[node*2]+tree[node*2+1];
}// 建树
void update(int node,int st,int ed,int idx,int val){
//idx是arr中要改的值的对应坐标,val是要改成的值
if(st==ed){
arr[idx]+=val;
tree[node]=arr[idx];//*注意是node*
return;
}
int mid=(st+ed)/2;
if(idx>=st&&idx<=mid){
update(node*2, st, mid, idx, val);
}
else {
update(node*2+1, mid+1, ed, idx, val);
}
tree[node]=tree[node*2]+tree[node*2+1];
}//单点修改
int query(int node,int st,int ed,int L,int R){
if(L>ed||R<st)return 0;
if(st>=L&&ed<=R)return tree[node];
int mid=(st+ed)/2;
return query(node*2,st,mid,L,R)+query(node*2+1, mid+1, ed, L, R);
}//区间求和
void push_down(int node,int st,int ed){
if(lazy[node]==0)return;
int mid=(st+ed)/2;
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
tree[node*2]+=(mid-st+1)*lazy[node];
tree[node*2+1]+=(ed-mid)*lazy[node];
lazy[node]=0;
}
//lazy下放
void update(int node,int st,int ed,int L,int R,int val){
//L和R是要修改的区间
if(L<=st&&R>=ed){
lazy[node]+=val;
tree[node]+=val*(R-L+1);
return;
}
int mid=(st+ed)/2;
push_down(node, st, ed);
if(L<=mid){
update(node*2,st,mid,L,R,val);
}
if(R>mid) {
update(node*2+1,mid+1,ed,L,R,val);
}
tree[node]=tree[node*2]+tree[node*2+1];
}//区间修改