rt。要求包含区间加,区间改,区间和,区间最大的结构体线段树板子,或者帮我改一下。
template<typename T>
struct segmentTree{
int n;
vector<T>tree,lazy,cover;
segmentTree(int n){this->n=n;tree.resize(4*n);lazy.resize(4*n,0);cover.resize(4*n,-1);}
segmentTree(T arr[],int size):n(size){
tree.resize(4*n);lazy.resize(4*n,0);cover.resize(4*n,-1);build(arr,1,0,n-1);
}
void build(vector<T>&arr,int node,int start,int end){
lazy[node]=0;cover[node]=-1;
if(start==end){tree[node]=arr[start];return;}
int mid=(start+end)/2;
build(arr,2*node,start,mid);
build(arr,2*node+1,mid+1,end);
tree[node]=tree[2*node]+tree[2*node+1];
}
void build(T arr[],int node,int start,int end){
lazy[node]=0;cover[node]=-1;
if(start==end){tree[node]=arr[start];return;}
int mid=(start+end)/2;
build(arr,2*node,start,mid);
build(arr,2*node+1,mid+1,end);
tree[node]=tree[2*node]+tree[2*node+1];
}
void pushdown(int node,int start,int end){
int mid=(start+end)/2;
if(cover[node]!=-1){
tree[2*node]=cover[node]*(mid-start+1);
tree[2*node+1]=cover[node]*(end-mid);
cover[2*node]=cover[2*node+1]=cover[node];
lazy[2*node]=lazy[2*node+1]=0;
cover[node]=-1;
}
if(lazy[node]!=0){
tree[2*node]+=lazy[node]*(mid-start+1);
tree[2*node+1]+=lazy[node]*(end-mid);
lazy[2*node]+=lazy[node];
lazy[2*node+1]+=lazy[node];
lazy[node]=0;
}
}
void update(int node,int start,int end,int l,int r,T val){
if(start>r||end<l)return;
if(start>=l&&end<=r){
tree[node]=val*(end-start+1);
cover[node]=val;
lazy[node]=0;
return;
}
pushdown(node,start,end);
int mid=(start+end)/2;
update(2*node,start,mid,l,r,val);
update(2*node+1,mid+1,end,l,r,val);
tree[node]=tree[2*node]+tree[2*node+1];
}
void update(int l,int r,T val){update(1,0,n-1,l,r,val);}
void add(int node,int start,int end,int l,int r,T val){
if(start>r||end<l)return;
if(start>=l&&end<=r){tree[node]+=(end-start+1)*val;lazy[node]+=val;return;}
pushdown(node,start,end);
int mid=(start+end)/2;
add(2*node,start,mid,l,r,val);
add(2*node+1,mid+1,end,l,r,val);
tree[node]=tree[2*node]+tree[2*node+1];
}
void add(int l,int r,T val){add(1,0,n-1,l,r,val);}
T ask(int node,int start,int end,int l,int r){
if(start>r||end<l)return 0;
if(start>=l&&end<=r)return tree[node];
pushdown(node,start,end);
int mid=(start+end)/2;
T left=ask(2*node,start,mid,l,r);
T right=ask(2*node+1,mid+1,end,l,r);
return left+right;
}
T ask(int l,int r){return ask(1,0,n-1,l,r);}
T askmax(int node,int start,int end,int l,int r){
if(start>r||end<l)return 0;
if(start>=l&&end<=r)return tree[node];
pushdown(node,start,end);
int mid=(start+end)/2;
T left=ask(2*node,start,mid,l,r);
T right=ask(2*node+1,mid+1,end,l,r);
return max(left,right);
}
T askmax(int l,int r){return askmax(1,0,n-1,l,r);}
};