CODEVS 1081 线段树区间修改
2015-07-20 21:50
441 查看
一份经典的递归线段树模版
[简单区间修改]
[简单区间修改]
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; int f[400010],a[100010],n,x,q; void change(int now,int l,int r,int l1,int r1,int va){ if (l==l1&&r==r1) f[now]+=va; else { f[now*2]+=f[now];f[now*2+1]+=f[now]; f[now]=0; int mid=(l+r)/2; if (mid>=r1) change(now*2,l,mid,l1,r1,va); else if (mid<l1) change(now*2+1,mid+1,r,l1,r1,va); else { change(now*2,l,mid,l1,mid,va); change(now*2+1,mid+1,r,mid+1,r1,va); } } } int query(int now,int l,int r,int tar){ if (l==r) return f[now]; else { int mid=(l+r)/2; if (mid>=tar) return query(now*2,l,mid,tar)+f[now]; else return query(now*2+1,mid+1,r,tar)+f[now]; } } int main(){ memset(f,0,sizeof(f)); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&q); for (int i=1;i<=q;i++) { int l,r,v,y; scanf("%d",&x); if (x==1){ scanf("%d%d%d",&l,&r,&v); change(1,1,n,l,r,v); } if (x==2){ scanf("%d",&y); printf("%d\n",query(1,1,n,y)+a[y]); } } return 0; }
相关文章推荐
- [翻译] SIAlertView
- 前端——剪刀石头布
- ZeroClipboard及其原理介绍
- [leedcode 103] Binary Tree Zigzag Level Order Traversal
- 数列有序
- 状态模式
- 网售毕业生,谁的悲剧?
- Android 外部存储无法写入的解决方法
- MySql 命令大全
- MySQL事务隔离级别
- 张珺 2015/07/09 个人文档
- OC运行和方法实现
- [DLX重复覆盖] hdu 3529 Bomberman - Just Search!
- 陈嘉 2015/07/10 个人文档
- 如何在虚拟机中安装linux系统
- [剑指Offer]12.二进制中1的个数
- 赵晓铮 2015/7/16 个人文档
- 关于#ifndef,#define,#end的说明
- IOS基本数据类型的包装类
- 简单问题的八种排序方法