线段树模板
来源:互联网 发布:电动牙刷 知乎 编辑:程序博客网 时间:2024/05/18 12:35
#include <iostream>#include <cstdlib>#include <cstdio>#define maxn 100005#define mid (l+r)/2using namespace std;int n, m;long long sum[maxn << 2], maxs[maxn << 2], add[maxn<<2];void PushUp(int id){ sum[id] = sum[id << 1] + sum[id << 1 | 1]; maxs[id] = max(maxs[id << 1], maxs[id << 1 | 1]);}void Pusdown(int pr, int pl, int id){ if(add[id]) { add[id << 1] += add[id]; add[id << 1 | 1] += add[id]; sum[id << 1] += add[id] * pr; sum[id << 1 | 1] += add[id] * pl; maxs[id << 1] += add[id]; maxs[id << 1 | 1] += add[id]; add[id] = 0; }}void Build(int l, int r, int id) //建树{ add[id] = 0; if(l == r) { scanf("%lld", &sum[id]); maxs[id] = sum[id]; return ; } Build(l, mid, id << 1); Build(mid + 1, r, id << 1 | 1); PushUp(id);}void Update(int l, int r, int id, int pos, long long c) //点修改{ if(l > pos || r < pos) return ; if(l == r && l == id) { sum[id] += c; maxs[id] += c; return ; } Update(l, mid, id << 1, pos, c); Update(mid + 1, r, id << 1 | 1, pos, c); PushUp(id);}void UpDate(int l, int r, int pl, int pr, int id, long long c) //区间修改{ if(l > pr || r < pl) return ; if(l >= pl && r <= pr) { sum[id] += (r - l + 1) * c; maxs[id] += c; add[id] += c; return; } Pusdown(mid - l + 1, r - mid,id); UpDate(l, mid, pl, pr, id << 1, c); UpDate(mid + 1, r, pl, pr, id << 1 | 1, c); PushUp(id);}long long Query(int l, int r, int pl, int pr, int id){ if(r < pl || l > pr) return 0; if(l >= pl && r <= pr) { return sum[id]; } Pusdown(mid - l + 1, r - mid, id); long long sums = 0; sums += Query(l, mid, pl, pr, id << 1); sums += Query(mid + 1, r, pl, pr, id << 1 | 1); return sums;}long long QueryMax(int l, int r, int pl, int pr, int id){ if(r < pl || l > pr) return 0; if(l >= pl && r <= pr) { return maxs[id]; } Pusdown(mid - l + 1, r - mid, id); long long ma = 0; ma = max(Query(l, mid, pl, pr, id << 1), Query(mid + 1, r, pl, pr, id << 1 | 1)); return ma;}int main(){ char c; int x, y; long long d; scanf("%d %d", &n, &m); Build(1, n, 1); getchar(); while(m--) { scanf("%c", &c); if(c == 'Q') { scanf("%d %d", &x, &y); cout << Query(1, n, x, y, 1) << endl; } else { scanf("%d %d %lld", &x, &y, &d); UpDate(1, n, x, y, 1, d); } getchar(); } return 0;}
阅读全文
0 0
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- C++贪心算法之装箱问题
- 1191: [HNOI2006]超级英雄Hero
- 人生格局,穷人和富人的差距
- 多校连萌-GJJ的日常之暴富梦
- 数组(array)概述
- 线段树模板
- python入门(二十六):基于反射模拟Web框架路由系统
- 大数据生态系统基础:Hadoop(五):Hadoop 3.0.0 HDFS读写及编程基础
- Python
- Java_18 File类
- codeforces 831B Keyboard Layouts
- 关于java中byte的相关问题
- js与Jquery的区别是什么?
- SQL Server 学习笔记之Collation(校对)