单点改值
struct LineTree{
static const int N=50010;
typedef struct Tree{
int left,right;
int sum;
}tree;
tree t[4*N];
int a[N];
int n;
int sum;
// x<<1 -> x*2
// x<<1|1 -> x*2+1
void build(int id,int l,int r){
t[id].left=l;
t[id].right=r;
if(l==r){
t[id].sum=a[l];
}else{
int mid=(l+r)/2;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
}
}
void update(int id,int pos,int val){
t[id].sum+=val;
if(t[id].left==t[id].right)return;
int mid=(t[id].left+t[id].right)/2;
if(pos<=mid)update(id<<1,pos,val);
else update(id<<1|1,pos,val);
}
void query(int id,int l,int r){
if(l<=t[id].left&&r>=t[id].right){
sum+=t[id].sum;
}else{
int mid=(t[id].left+t[id].right)/2;
if(r<=mid) query(id<<1,l,r);
else if(l>=mid+1) query(id<<1|1,l,r);
else{
query(id<<1,l,r);
query(id<<1|1,l,r);
}
}
}
int que(int l,int r){
sum=0;
query(1,l,r);
return sum;
}
void bui(){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
}
}T;
线段改值
struct LineTree{
static const int N=100010;
typedef struct Tree{
int left,right;
int sum;
}tree;
tree t[4*N];
int n;
int sum;
void build(int id,int l,int r){
t[id].left=l;
t[id].right=r;
if(l==r){
t[id].sum=0;
return;
}else{
int mid=(l+r)/2;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
t[id].sum=0;
}
}
void update(int id,int left,int right){
if(left==t[id].left&&right==t[id].right){
t[id].sum++;
return;
}
if(t[id].left==t[id].right)return;
int mid=(t[id].left+t[id].right)/2;
if(right<=mid)update(id<<1,left,right);
else if(left>=mid+1)update(id<<1|1,left,right);
else{
update(id<<1,left,mid);
update(id<<1|1,mid+1,right);
}
}
int query(int id,int l,int r){
if(t[id].left==l&&t[id].right==r){
return t[id].sum;
}
if(t[id].left==t[id].right)return 0;
int mid=(t[id].left+t[id].right)/2;
if(mid>=r){
return t[id].sum+query(id<<1,l,r);
}else if(l>=mid+1){
return t[id].sum+query(id<<1|1,l,r);
}else{
return t[id].sum+query(id<<1,l,mid)+query(id<<1|1,mid+1,r);
}
}
void bui(){
memset(t,0,sizeof(t));
build(1,1,n);
}
}T;