两种操作,
0)区间加减,记add标记
1)区间设置为某一个值,记set标记
使用2个懒惰标记,然后注意的是,2个操作的优先级,也就是下放节点的标记的时候,注意先检查set标记,因为set是会覆盖掉区间的加减操作的。所以在使用set标记的时候,清空add标记,
#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd
#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)
const int maxn = 1e5+10;
const int inf = 1 << 28;
struct node{
int lazy1,lazy2;//lazy1 is add, and lazy2 is set operation
int sum;
}p[maxn<<2];
void push_up(int rt){
p[rt].sum = p[rt<<1].sum+p[rt<<1|1].sum;
}
void build(int rt,int l,int r){
if(l==r){
scanf("%d",&p[rt].sum);
return ;
}
p[rt].lazy1=p[rt].lazy2=0;
int mid = l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
push_up(rt);
}
void push_down(int rt,int l,int r){
int lson = rt<<1;
int rson = rt<<1|1;
int mid = l+r>>1;
if(p[rt].lazy2!=0){
p[lson].lazy1 = p[rson].lazy1 = 0; //clear the other tag
p[lson].lazy2 = p[rson].lazy2 = p[rt].lazy2;
p[lson].sum = (mid-l+1) * p[rt].lazy2;
p[rson].sum = (r-(mid+1)+1) * p[rt].lazy2;
p[rt].lazy2 = 0;
}
if(p[rt].lazy1!=0){
p[lson].lazy1 += p[rt].lazy1;
p[rson].lazy1 += p[rt].lazy1;
p[lson].sum += (mid-l+1) * p[rt].lazy1;
p[rson].sum += (r-(mid+1)+1) * p[rt].lazy1;
p[rt].lazy1 = 0;
}
}
void updata_add(int rt,int l,int r,int x,int y,int val){
if(x<=l&&r<=y){
p[rt].lazy1 += val;
p[rt].sum += (r-l+1) * val;
return ;
}
int mid = l+r>>1;
push_down(rt,l,r);
if(x<=mid) updata_add(rt<<1,l,mid,x,y,val);
if(y> mid) updata_add(rt<<1|1,mid+1,r,x,y,val);
push_up(rt);
}
void updata_set(int rt,int l,int r,int x,int y,int val){
if(x<=l&&r<=y){
p[rt].sum = val*(r-l+1);
p[rt].lazy2 = val;
p[rt].lazy1=0;
return ;
}
int mid = l+r>>1;
push_down(rt,l,r);
if(x<=mid)updata_set(rt<<1,l,mid,x,y,val);
if(y> mid)updata_set(rt<<1|1,mid+1,r,x,y,val);
push_up(rt);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);n++;
build(1,1,n);
while(m--){
int type,x,y,val;
scanf("%d%d%d%d",&type,&x,&y,&val);
x++;y++;
if(type==0){
updata_add(1,1,n,x,y,val);
}
else {
updata_set(1,1,n,x,y,val);
}
printf("%d\n",p[1].sum);
}
return 0;
}