1.只维护加法
【模板】线段树 1
| #include<cstdio> |
| using namespace std; |
| typedef long long ll; |
| const int NN = 1e5+8; |
| int n,m; |
| ll a[NN]; |
| struct seg{ |
| ll l,r; |
| ll sum,add; |
| #define l(x) tree[x].l |
| #define r(x) tree[x].r |
| #define sum(x) tree[x].sum |
| #define add(x) tree[x].add |
| #define ls(x) x << 1 |
| #define rs(x) x << 1 | 1 |
| }tree[NN<<2]; |
| void addlz(ll x,ll d){ |
| add(x) += d;sum(x) += d*(r(x)-l(x)+1); |
| } |
| void pushdown(int x){ |
| addlz(ls(x),add(x));addlz(rs(x),add(x)); |
| add(x) = 0; |
| return; |
| } |
| void pushup(int x){ |
| sum(x) = sum(ls(x)) + sum(rs(x)); |
| } |
| void build(int p,int l,int r){ |
| l(p) = l;r(p) = r; |
| if(l == r){sum(p) = a[l];return;} |
| int mid = (l+r)>>1; |
| build(ls(p),l,mid); |
| build(rs(p),mid+1,r); |
| pushup(p); |
| } |
| void change(ll p,ll l,ll r,ll d){ |
| if(l <= l(p) && r(p) <= r){addlz(p,d);return;} |
| pushdown(p); |
| ll mid = (l(p)+r(p))>>1; |
| if(l <= mid) change(ls(p),l,r,d); |
| if(r > mid) change(rs(p),l,r,d); |
| pushup(p); |
| } |
| ll query(int p,int l,int r){ |
| if(l <= l(p) && r(p) <= r){return sum(p);} |
| ll mid = (l(p)+r(p))>>1; |
| pushdown(p); |
| ll res = 0; |
| if(l <= mid) res += query(ls(p),l,r); |
| if(r > mid) res += query(rs(p),l,r); |
| return res; |
| } |
| int main(){ |
| scanf("%d%d",&n,&m); |
| for(int i = 1; i <= n; i++) |
| scanf("%lld",&a[i]); |
| build(1,1,m); |
| for(int i = 1,type,a,b,c; i <= m; i++){ |
| scanf("%d",&type); |
| if(type == 1){ |
| scanf("%d%d%d",&a,&b,&c); |
| change(1,a,b,c); |
| } |
| if(type == 2){ |
| scanf("%d%d",&a,&b); |
| printf("%lld\n",query(1,a,b)); |
| } |
| |
| } |
| } |
2. 维护加法和乘法
【模板】线段树 2
| #include<cstdio> |
| using namespace std; |
| typedef long long ll; |
| const int NN = 1e5+8; |
| int n,m,mod; |
| ll a[NN]; |
| inline ll Calc(const ll a,const ll b){ll res = a+b;return res-(res>=mod?mod:0);} |
| inline ll Mult(const ll a, const ll b){return a*b%mod;} |
| struct seg{ |
| ll l,r; |
| ll sum,add,mul; |
| #define l(x) tree[x].l |
| #define r(x) tree[x].r |
| #define sum(x) tree[x].sum |
| #define add(x) tree[x].add |
| #define mul(x) tree[x].mul |
| #define ls(x) x << 1 |
| #define rs(x) x << 1 | 1 |
| }tree[NN<<2]; |
| void addlz(ll x,ll d){ |
| add(x) = Calc(add(x),d);sum(x) = Calc(sum(x),Mult(d,r(x)-l(x)+1)); |
| } |
| void mullz(ll x,ll d){ |
| mul(x) = Mult(mul(x),d);sum(x) = Mult(sum(x),d);add(x) = Mult(add(x),d); |
| } |
| void pushdown(int x){ |
| mullz(ls(x),mul(x));mullz(rs(x),mul(x)); |
| addlz(ls(x),add(x));addlz(rs(x),add(x)); |
| add(x) = 0; mul(x) = 1; |
| return; |
| } |
| void pushup(int x){ |
| sum(x) = Calc(sum(ls(x)) , sum(rs(x))); |
| } |
| void build(int p,int l,int r){ |
| mul(p) = 1; |
| l(p) = l;r(p) = r; |
| if(l == r){sum(p) = a[l];return;} |
| int mid = (l+r)>>1; |
| build(ls(p),l,mid); |
| build(rs(p),mid+1,r); |
| pushup(p); |
| } |
| void change_add(ll p,ll l,ll r,ll d){ |
| if(l <= l(p) && r(p) <= r){addlz(p,d);return;} |
| pushdown(p); |
| ll mid = (l(p)+r(p))>>1; |
| if(l <= mid) change_add(ls(p),l,r,d); |
| if(r > mid) change_add(rs(p),l,r,d); |
| pushup(p); |
| } |
| void change_mul(ll p,ll l,ll r,ll d){ |
| if(l <= l(p) && r(p) <= r){mullz(p,d);return;} |
| pushdown(p); |
| ll mid = (l(p)+r(p))>>1; |
| if(l <= mid) change_mul(ls(p),l,r,d); |
| if(r > mid) change_mul(rs(p),l,r,d); |
| pushup(p); |
| } |
| ll query(int p,int l,int r){ |
| if(l <= l(p) && r(p) <= r){return sum(p);} |
| ll mid = (l(p)+r(p))>>1; |
| pushdown(p); |
| ll res = 0; |
| if(l <= mid) res = Calc(res,query(ls(p),l,r)); |
| if(r > mid) res = Calc(res,query(rs(p),l,r)); |
| return res; |
| } |
| |
| |
| |
| |
| |
| |
| int main(){ |
| scanf("%d%d%d",&n,&m,&mod); |
| for(int i = 1; i <= n; i++) |
| scanf("%lld",&a[i]); |
| build(1,1,m); |
| |
| for(int i = 1,type,a,b,c; i <= m; i++){ |
| scanf("%d",&type); |
| if(type == 1){ |
| scanf("%d%d%d",&a,&b,&c); |
| change_mul(1,a,b,c); |
| } |
| else if(type == 2){ |
| scanf("%d%d%d",&a,&b,&c); |
| change_add(1,a,b,c); |
| } |
| else if(type == 3){ |
| scanf("%d%d",&a,&b); |
| printf("%lld\n",query(1,a,b)); |
| } |
| |
| } |
| } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步