蒟蒻写的线段树板子(这个)
不知道这一份代码CE的原因是什么,求大佬指出和提出修改意见!
期望在封装的基础上修改。
devc++报错是:
invalid use of non-static data member
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const int N=5e5+5;
int a[N];
struct SegTree{
struct Modify{
int add;
Modify operator +(const Modify &b){
return Modify{add+b.add};
}
} ;
static Modify Zero_Modify;
struct node{
int w,sz; Modify tag;
node operator +(const node &b){
return node{w+b.w,sz+b.sz,Zero_Modify};
}
node operator +(const Modify &c){
return node{w+c.add*sz,sz,tag+c};
}
};
node tr[N<<2]; static node Empty_node;
inline int ls(int u){ return u<<1; }
inline int rs(int u){ return u<<1|1; }
inline bool IN(int l,int r,int x,int y){ return x<=l&&r<=y; }
inline bool OUT(int l,int r,int x,int y){ return r<x||y<l; }
inline void Init(int Empty_weigh,int Empty_size,int Zero_Modify_Target){
Zero_Modify=Modify{ Zero_Modify_Target };
Empty_node=node{ Empty_weigh,Empty_size,Zero_Modify };
}
void pushup(int u){ tr[u]=tr[ls(u)]+tr[rs(u)]; }
void maketag(int u,Modify k){
tr[u]=tr[u]+k;
}
void pushdown(int u){
maketag(ls(u),tr[u].tag); maketag(rs(u),tr[u].tag);
tr[u].tag=Zero_Modify;
}
void Build(int u,int l,int r){
if(l==r){ tr[u]=node{a[l],1,Zero_Modify}; return ; }
int mid=(l+r>>1);
Build(ls(u),l,mid); Build(rs(u),mid+1,r);
pushup(u);
}
void Update(int u,int l,int r,int x,int y,Modify k){
if(IN(l,r,x,y)) { maketag(u,k); return ; }
else if(OUT(l,r,x,y)) return ;
else {
pushdown(u);
int mid=(l+r>>1);
Update(ls(u),l,mid,x,y,k); Update(rs(u),mid+1,r,x,y,k);
pushup(u);
}
}
node Query(int u,int l,int r,int x,int y){
if(IN(l,r,x,y)) { return tr[u]; }
else if(OUT(l,r,x,y)){ return Empty_node; }
else{
pushdown(u);
int mid=(l+r>>1);
node ret=Empty_node;
ret=ret+Query(ls(u),l,mid,x,y); ret=ret+Query(rs(u),mid+1,r,x,y);
return ret;
}
}
};
SegTree T;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
T.Init(0,0,0);
T.Build(1,1,n);
while(m--){
int opt; cin>>opt;
int l,r,k; cin>>l>>r;
if(opt==1){
cin>>k;
T.Update(1,1,n,l,r,SegTree::Modify{k});
}
else {
SegTree::node ret=T.Query(1,1,n,l,r);
cout<<ret.w<<'\n';
}
}
return 0;
}