基础线段树 & 线段树区间赋值
struct SegmentTree{
int l, r;
int dat, lazy;
}t[maxn*4 + 2];
void Build(int p,int l,int r){
t[p].l = l, t[p].r = r;
if (l == r) { t[p].dat = a[l]; return; }
int mid = (l + r) >> 1;
Build(lson, l, mid);
Build(rson, mid+1, r);
t[p].dat = t[lson].dat + t[rson].dat;
}
void lazytag(int p){
if(t[p].lazy){
t[lson].dat += t[p].lazy * (t[lson].r - t[lson].l + 1);
t[rson].dat += t[p].lazy * (t[rson].r - t[rson].l + 1);
t[lson].lazy += t[p].lazy;
t[rson].lazy += t[p].lazy;
t[p].lazy = 0;
}
}
void Add(int p, int x, int k){
if (t[p].l == t[p].r) { t[p].dat += k; return;}
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) Add(lson, x, k);
else if (mid < x) Add(rson, x, k);
t[p].dat = t[lson].dat + t[rson].dat;
}
int query(int p,int x, int y){
if(x <= t[p].l && t[p].r <= y) return t[p].dat;
lazytag(p);
int mid = (t[p].l + t[p].r) >> 1, val = 0;
if (x <= mid) val += query(lson, x, y);
if (mid < y) val += query(rson, x, y);
return val;
}
void change(int point, int x, int y, int val){
if (x <= t[point].left && t[point].right <= y){
t[point].data += (ll)val * (t[point].right-t[point].left+1);
t[point].lazy += val;
return;
}
lazytag(point);
int mid = (t[point].left + t[point].right) / 2;
if (x <= mid) change(point*2, x, y, val);
if (mid < y) change(point*2+1, x, y, val);
t[point].data = t[point*2].data + t[point*2+1].data;
}
void push_up(int p){
t[p].data = t[p*2].data + t[p*2+1].data;
}
void Build(int p,int l, int r){
t[p].left = l, t[p].right = r;
if(r == l){
t[p].data = arr[l];
return;
}
int mid = (l + r) >> 1;
Build(p*2, l, mid);
Build(p*2+1, mid+1, r);
push_up(p);
}
void push_down(int p){
if(t[p].lazy != -1){
t[p*2].lazy = t[p*2+1].lazy = t[p].lazy;
int mid = (t[p].left + t[p].right) >> 1;
t[p*2].data = t[p].lazy*(mid - t[p].left + 1);
t[p*2+1].data = t[p].lazy*(t[p].right - mid );
t[p].data = t[p].lazy * (t[p].right - t[p].left + 1);
t[p].lazy = -1;
}
}
void dis(int p, int l, int r){
if(t[p].left == t[p].right){
cout<<t[p].data;
return ;
}
push_down(p);
int mid = ( t[p].left + t[p].right) >> 1;
dis(p*2,l , mid);
dis(p*2+1, mid +1,r);
}
void up_date(int p,int l,int r,int v){
if(l > r || r > SIZE) return;
if(t[p].left ==l&&t[p].right==r){
t[p].lazy = v;
t[p].data = v * (r - l + 1);
return ;
}
push_down(p);
int mid=(t[p].left+t[p].right) >> 1;
if(r<=mid){
up_date(p*2,l,r,v);
}
else if(l>mid){
up_date(p*2+1,l,r,v);
}
else{
up_date(p*2,l,mid,v);
up_date(p*2+1,mid+1,r,v);
}
push_up(p);
}
int ask(int p, int x, int y){
if(x <= t[p].left && t[p].right <= y)
return t[p].data;
push_down(p);
int mid = (t[p].left + t[p].right) / 2;
int val = 0;
if (x <= mid)
val += ask(p*2, x, y);
if(mid < y)
val += ask(p*2+1, x, y);
return val;
}
void Init(){
for(int i=1;i<=SIZE*4;i++)
t[i].lazy = -1;
}