线段树模板
2018-05-05 17:32
411 查看
区间修改,区间查询,求和
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e6+6; #define LL long long #define INF 0x7fffffff int n,q,a[maxn]; struct node{ int l, r; LL sum, lazy; void update(int x) { sum += 1LL*(r-l+1)*x; // 防止爆int lazy += x; } }tree[maxn*4]; void push_up(int x) { tree[x].sum = tree[x<<1].sum + tree[x<<1|1].sum; } void push_down(int x) { int lazy = tree[x].lazy; if(lazy) { tree[x<<1].update(lazy); tree[x<<1|1].update(lazy); tree[x].lazy = 0; } } void build(int x, int l, int r) { tree[x].l = l, tree[x].r = r; tree[x].sum = tree[x].lazy = 0; if(l == r) { tree[x].sum = a[l]; } else { int mid = (l+r) / 2; build(x<<1, l, mid); build(x<<1|1, mid+1, r); push_up(x); } } void update(int x, int l, int r, int val) { int L = tree[x].l, R = tree[x].r; if(l <= L && R <= r) { tree[x].update(val); } else { push_down(x); int mid = (L+R) / 2; if(mid >= l) update(x<<1, l, r, val); if(r > mid) update(x<<1|1, l, r, val); push_up(x); } } LL query(int x, int l, int r) { int L = tree[x].l, R = tree[x].r; if(l <= L && R <= r) return tree[x].sum; else { push_down(x); int mid = (L+R) / 2; LL ans = 0; if(mid >= l) ans += query(x<<1, l, r); if(r > mid) ans += query(x<<1|1, l, r); push_up(x); return ans; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)a[i]=0; build(1,1,n); scanf("%d",&q); for(int i=1;i<=q;i++) { int o,l,r,val; scanf("%d%d%d%d",&o,&l,&r,&val); if(o==0)update(1,l,r,val); else printf("%lld\n",query(1,l,r)); } return 0; }
相关文章推荐
- 线段树模板
- 线段树单点更新模板 HDU-1166
- P3372 【模板】线段树 1 洛谷
- 线段树维护区间和模板(单结点更新)(1166)
- Hihocoder #1077 : RMQ问题再临-线段树(线段树:结构体建树+更新叶子往上+查询+巧妙使用father[]+线段树数组要开大4倍 *【模板】)
- 线段树(大三的模板)
- 线段树模板
- 线段树模板
- 线段树模板
- NOIP算法每周过之 线段树 区间 区间修改 区间查值 模板
- hdu1166 敌兵布阵——(线段树模板)
- luoguP3373 【模板】线段树 2
- POJ 3468 线段树区间更新求和模板
- 线段树单点更新模板-杭电1166
- 【线段树成段更新成段查询模板】【POJ3468】A Simple Problem with Integerst
- 线段树(模板)
- 洛谷 P3372 【模板】线段树 1
- P3372 【模板】线段树 1 区间查询与区间修改
- 线段树,不要依赖模板
- hihoCoder - 1586 Minimum 线段树模板