自用线段树模板
2017-11-11 18:42
281 查看
已经没什么好说的了。
#include <iostream> #include <cstdio> #include <cstring> #define maxn 100010 using namespace std; long long a[maxn]; struct segment_tree{ long long sum[maxn<<2+1];long long add[maxn<<2+1]; #define lson o<<1 #define rson o<<1|1 inline void push_down(int o,int l,int r){ if(!add[o]) return; add[lson] += add[o]; add[rson] += add[o]; int mid = (l+r) >> 1; sum[lson] += add[o]*(mid - l + 1); sum[rson] += add[o]*(r - mid); add[o] = 0; } inline void push_up(int o){ sum[o] = sum[lson] + sum[rson]; } inline void build(int o,int l,int r){ add[o] = 0; if(l == r){ sum[o] = a[l]; return; } int mid = (l+r) >> 1; build(lson,l,mid); build(rson,mid+1,r); push_up(o); } inline long long calc_sum(int o,int l,int r,int ql,int qr){ if(ql <= l && qr >= r) return sum[o]; int mid = (l+r) >> 1; push_down(o,l,r); long long ans = 0; if(ql <= mid) ans += calc_sum(lson,l,mid,ql,qr); if(qr > mid) ans += calc_sum(rson,mid+1,r,ql,qr); return ans; } inline void update(int o,int l,int r,int ql,int qr,int v){ if(ql <= l && qr >= r){ add[o] += v; sum[o] += v*(r - l + 1); return; } int mid = (l+r) >> 1; push_down(o,l,r); if(ql <= mid) update(lson,l,mid,ql,qr,v); if(qr > mid) update(rson,mid+1,r,ql,qr,v); push_down(o,l,r); push_up(o); } }; int n,m; segment_tree tree; inline int read(){ int num = 0; char c; bool flag = false; while ((c = getchar()) == ' ' || c == '\n' || c == '\r'); if (c == '-') flag = true; else num = c - '0'; while (isdigit(c = getchar())) num = num * 10 + c - '0'; return (flag ? -1 : 1) * num; } int main(){ n = read();m = read(); for(int i=1;i<=n;i++) a[i] = 1ll*read(); tree.build(1,1,n); for(int i=1;i<=m;i++){ int opt,x,y; long long k; opt = read(); if(opt == 2){ x = read();y = read(); long long int s = tree.calc_sum(1,1,n,x,y); printf("%lld\n",s); } if(opt == 1){ x = read();y = read();k = read(); tree.update(1,1,n,x,y,k); } } return 0; }
相关文章推荐
- 线段树模板及其运用
- 洛谷P3372 【模板】线段树 1(lazy)
- 线段树模板
- 线段树模板(求最大最小)
- 线段树单点更新,区间求和、求最值 模板(区间更新的模板待续)
- hdu 3074 Multiply game(线段树模板题) 解题报告
- 【模板】线段树区间修改、区间求和、查询最值
- 线段树专题—POJ 3667 Hotel(区间合并模板)
- 线段树最全模板
- poj 3264 Balanced Lineup (线段树模板题)
- poj 3237 树链剖分模板(用到线段树lazy操作)
- ACM 线段树模板(模板)
- 自用二分图匹配模板
- POJ3468 区间加,区间求和 线段树模板
- 线段树 --- (单点更新、区间最值、模板题)
- hdu 1166 敌兵布阵(线段树模板)
- 【自用模板】高精度GCD(二进制)
- NOIP算法每周过之 线段树 区间 区间修改 区间查值 模板
- 线段树模板 区间加减 区间修改
- 【常用模板】 线段树单点操作