线段树的各种板板~(*^▽^*)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x3f3f3f3f
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
#define lson (rt<<1)
#define rson (rt<<1|1) //¼´rson
const int N=1e5+100;
int a[N],n,m;
char s[10];
struct Segment_tree{
struct seg_tree{
int l,r,maxx,minn,sum;
int lazy;
}tr[N<<2];
void pushup(int rt){
tr[rt].sum=tr[lson].sum+tr[rson].sum;
tr[rt].maxx=max(tr[lson].maxx,tr[rson].maxx);
tr[rt].minn=min(tr[lson].minn,tr[rson].minn);
}
//建树
void build(int rt,int l,int r){
tr[rt].l=l;
tr[rt].r=r;
if(l==r){
tr[rt].sum=a[l];
return ;
}
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(rt);
}
//求总和更新值
void changesum(int rt,int pos,int k){
if(tr[rt].l==tr[rt].r){
tr[rt].sum+=k;
return;
}
if(pos<=tr[lson].r)
changesum(lson,pos,k);
else
changesum(rson,pos,k);
tr[rt].sum=tr[lson].sum+tr[rson].sum;
return;
}
//求最大更新值
void changemax(int rt,int pos,int k){
if(tr[rt].l==tr[rt].r){
tr[rt].maxx=k;
return;
}
int mid=(tr[rt].l+tr[rt].r)>>1;
if(pos<=mid)
changemax(lson,pos,k);
else
changemax(rson,pos,k);
tr[rt].maxx=max(tr[lson].maxx,tr[rson].maxx);
return;
}
//求最小更新值1
void changemin(int rt,int pos,int k){
if(tr[rt].l==tr[rt].r){
tr[rt].minn=k;
return;
}
int mid=(tr[rt].l+tr[rt].r)>>1;
if(pos<=mid)
changemin(lson,pos,k);
else
changemin(rson,pos,k);
tr[rt].minn=min(tr[lson].minn,tr[rson].minn);
return;
}
//求最小更新值2
int askmin2(int rt,int l,int r){
if(l>r){
return INF;
}
if(tr[rt].l>=l&&tr[rt].r<=r){
return tr[rt].minn;
}
int mid=(tr[rt].l+tr[rt].r)>>1;
if(r<=mid){
return askmin(lson,l,r);
}
if(l>mid){
return askmin(rson,l,r);
}else{
return min(askmin(lson,l,mid),askmin(rson,mid+1,r));
}
}
//查询区间和
int asksum(int rt,int l,int r){
if(l<=tr[rt].l&&tr[rt].r<=r){
return tr[rt].sum;
}
if(tr[rt].r<l||tr[rt].l>r){
return 0;
}
int sum=0;
if(tr[lson].r>=l) sum+=asksum(lson,l,r);
if(tr[rson].l<=r) sum+=asksum(rson,l,r);
return sum;
}
//查询区间最大值
int askmax(int rt,int l,int r){
if(tr[rt].l>=l&&tr[rt].r<=r){
return tr[rt].maxx;
}
int mid=(tr[rt].l+tr[rt].r)>>1;
int res=-INF;
if(l<=mid){
res=max(res,askmax(lson,l,r));
}
if(r>mid){
res=max(res,askmax(rson,l,r));
}
return res;
}
//查询区间最小值
int askmin(int rt,int l,int r){
if(tr[rt].l>=l&&tr[rt].r<=r){
return tr[rt].minn;
}
int mid=(tr[rt].l+tr[rt].r)>>1;
int res=INF;
if(l<=mid){
res=min(res,askmin(lson,l,r));
}
if(r>mid){
res=min(res,askmin(rson,l,r));
}
return res;
}
//延迟标记(懒标记)区间修改 区间(也可单点)查询
//void pushdown(int rt){
// if(tr[rt].lazy){
// int lz=tr[rt].lazy;
// tr[rt].lazy=0;
// tr[lson].lazy+=lz;
// tr[rson].lazy+=lz;
// tr[lson].sum+=lz*(tr[lson].r-tr[lson].l+1);
// tr[rson].sum+=lz*(tr[rson].r-tr[rson].l+1);
// }
//}
//void update(int rt,int l,int r,int k){
// if(tr[rt].l>=l&&tr[rt].r<=r){
// tr[rt].lazy+=k;
// tr[rt].sum+=k*(tr[rt].r-tr[rt].l+1);
// return;
// }
// pushdown(rt);
// int mid=(tr[rt].l+tr[rt].r)>>1;
// if(l<=mid) update(lson,l,r,k);
// if(r>mid) update(rson,l,r,k);
// pushup(rt);
//}
//int query(int rt,int l,int r){
// if(tr[rt].l>=l&&tr[rt].r<=r){
// return tr[rt].sum;
// }
// pushdown(rt);
// int mid=(tr[rt].l+tr[rt].r)>>1;
// int res=0;
// if(l<=mid) res+=query(lson,l,r);
// if(r>mid) res+=query(rson,l,r);
// return res;
//}
//标记永久化
void update(int rt,int l,int r,int k){
tr[rt].cnt+=(min(tr[rt].r,r)-max(tr[rt].l,l)+1)*k;
if(tr[rt].l>=l && tr[rt].r<=r){
tr[rt].lz+=k;
return ;
}
int mid=(tr[rt].l+tr[rt].r)>>1;
if(l<=mid) update(ls,l,r,k);
if(r>mid) update(rs,l,r,k);
}
int query(int rt,int l,int r,int tag){
if(tr[rt].l>=l && tr[rt].r<=r){
return tr[rt].cnt+(tr[rt].r-tr[rt].l+1)*tag;
}
int mid=(tr[rt].l+tr[rt].r)>>1,res=0;
tag+=tr[rt].lz;
if(l<=mid) res+=query(ls,l,r,tag);
if(r>mid) res+=query(rs,l,r,tag);
return res;
}
}Tr;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
if(n==0)return Elaina;
Tr.build(1,1,n);
cin>>m;
//ÊäÈëÓ¦¸Ã²»ÓÃÎҽ̸øÄã°È(^_^)
for(int i=1;i<=m;i++){
}
return Elaina;
}
都看到这了,真的不点个赞吗(>ω<*)