都是一些裸线段树的模板,无主函数!
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define ll long long #define M 400010 #define lson l,m,now*2 #define rson m+1,r,now*2+1 using namespace std; ll tag[M],sum[M]; void push_up(int now) { sum[now]=sum[now*2]+sum[now*2+1]; } void push_down(int now,int m) { if(tag[now]) { tag[now*2]+=tag[now]; tag[now*2+1]+=tag[now]; sum[now*2]+=tag[now]*(m-(m/2)); sum[now*2+1]+=tag[now]*(m/2); tag[now]=0; } } void build(int l,int r,int now) { tag[now]=0; if(l==r) { scanf("%lld",&sum[now]); return; } int m=(l+r)/2; build(lson); build(rson); push_up(now); } void modify(int pos,int v,int l,int r,int now) { if(l==r) { sum[now]+=v; return; } int m=(l+r)/2; if(pos<=m)modify(pos,v,lson); else modify(pos,v,rson); push_up(now); } void change(int x,int y,int v,int l,int r,int now) { if(l>=x&&r<=y) { tag[now]+=v; sum[now]+=(ll)v*(r-l+1); return; } push_down(now,r-l+1); int m=(l+r)/2; if(x<=m)change(x,y,v,lson); if(y>m)change(x,y,v,rson); push_up(now); } ll query(int x,int y,int l,int r,int now) { if(l>=x&&r<=y)return sum[now]; push_down(now,r-l+1); int m=(l+r)/2; ll ans=0; if(x<=m)ans+=query(x,y,lson); if(y>m)ans+=query(x,y,rson); return ans; } ll search(int v,int l,int r,int now) { if(l==r) return sum[now]; push_down(now,r-l+1); int m=(r+l)/2; if(v<=m) search(v,lson); else if(v>m) search(v,rson); }