【codevs 1082】线段树练习3
2016-04-04 08:33
218 查看
#include <cstdio> #include <iostream> #include <cstring> #define ll long long using namespace std; int a[200000],n,Q; struct edge{ int l,r,add;ll sum; }node[200000*4]; void pushdown(int k) { node[k<<1].add += node[k].add; node[k<<1].sum += (node[k<<1].r-node[k<<1].l+1)*node[k].add; node[(k<<1)+1].add += node[k].add; node[(k<<1)+1].sum += (node[(k<<1)+1].r-node[(k<<1)+1].l+1)*node[k].add; node[k].add = 0; } void update(int k,int left,int right,int x) { if(left <= node[k].l && right >= node[k].r) { node[k].add += x; node[k].sum += (node[k].r-node[k].l+1)*x; return; } node[k].sum += (right-left+1)*x; if(node[k].add)pushdown(k); int mid = (node[k].l+node[k].r)>>1; if(right <= mid)update(k<<1,left,right,x); else if(left > mid)update((k<<1)+1,left,right,x); else { update(k<<1,left,mid,x); update((k<<1)+1,mid+1,right,x); } } ll query(int k,int left,int right) { if(left <= node[k].l && right >= node[k].r)return node[k].sum; if(node[k].add)pushdown(k); int mid = (node[k].l+node[k].r)>>1; if(right <= mid)return query(k<<1,left,right); else if(left > mid)return query((k<<1)+1,left,right); else return (query(k<<1,left,mid)+query((k<<1)+1,mid+1,right)); } void build(int k,int left,int right) { node[k].l = left,node[k].r = right; node[k].add = 0; if(node[k].l == node[k].r) { node[k].sum = a[left]; return; } int mid = (left+right)>>1; build(k<<1,left,mid); build((k<<1)+1,mid+1,right); node[k].sum = node[k<<1].sum + node[(k<<1)+1].sum; } int main() { cin>>n; for(int i = 1;i <= n;i++)scanf("%d",&a[i]); build(1,1,n); cin>>Q; for(int i = 1;i <= Q;i++) { int s,a,b,x;scanf("%d",&s); if(s == 1) { scanf("%d%d%d",&a,&b,&x); update(1,a,b,x); } else { scanf("%d%d",&a,&b); cout<<query(1,a,b)<<"\n"; } } return 0; }
相关文章推荐
- Timer与AlarmManager的差别
- 中低端的路由器在局域网内的数据传输速度
- web开发技术点解析
- [web问题解决]本地服务器无法打开html文档 表单传入数据库报错
- MMO游戏技能攻击区域的计算2--给地图划分格子
- 甲骨文的 Linux 部门主管 Coekaerts 跳槽到微软
- 算法备忘录——排序
- 屌丝的常用排序-----one
- 设计模式之单例模式
- 继承log4.net的类
- [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
- 算法备忘录——基础数据结构与复杂度
- android studio导入背景图片,改变图标,定时退出三个操作
- 30分钟LINQ教程(0)
- SQLIO 磁盘測试工具參考
- AutoMapperHelper
- Activiti 删除key值相同的所有不同版本的流程定义
- python web框架——扩展Django&tornado
- 在CentOS安装PHP5.6
- [LeetCode 267] Palindrome Permutation II