codevs 1081 线段树练习 2 区间更新 单点查询 无lazy
2016-07-21 13:55
411 查看
题目描述 Description
给你N个数,有两种操作
1:给区间[a,b]的所有数都增加X
2:询问第i个数是什么?
输入描述 Input Description
第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。
输出描述 Output Description
对于每个询问输出一行一个答案
样例输入 Sample Input
3
1
2
3
2
1 2 3 2
2 3
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
数据范围
1<=n<=100000
1<=q<=100000
题意: 中文题意
题解: 裸线段树 区间更新 单点查询 无lazy
给你N个数,有两种操作
1:给区间[a,b]的所有数都增加X
2:询问第i个数是什么?
输入描述 Input Description
第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。
输出描述 Output Description
对于每个询问输出一行一个答案
样例输入 Sample Input
3
1
2
3
2
1 2 3 2
2 3
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
数据范围
1<=n<=100000
1<=q<=100000
题意: 中文题意
题解: 裸线段树 区间更新 单点查询 无lazy
//code by drizzle #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #define ll __int64 #define PI acos(-1.0) #define mod 1000000007 using namespace std; struct node { int l,r,value; }tree[400005]; void buildtree(int root,int left,int right) { tree[root].l=left; tree[root].r=right; if(left==right) { scanf("%d",&tree[root].value); return ; } int mid=(left+right)>>1; buildtree(root<<1,left,mid); buildtree(root<<1|1,mid+1,right); tree[root].value=tree[root<<1].value+tree[root<<1|1].value; } void updata(int c,int left,int right,int root) { if(tree[root].l==left&&tree[root].r==right&&left==right) { tree[root].value+=c; return; } int mid=(tree[root].l+tree[root].r)>>1; if(right<=mid) updata(c,left,right,root<<1); else { if(left>mid) updata(c,left,right,root<<1|1); else { updata(c,left,mid,root<<1); updata(c,mid+1,right,root<<1|1); } } tree[root].value=tree[root<<1].value+tree[root<<1|1].value; } int query(int left ,int right,int root) { if(tree[root].l==left&&tree[root].r==right) { return tree[root].value; } int mid=(tree[root].l+tree[root].r)>>1; if(right<=mid) return query(left,right,root<<1); else { if(left>mid) return query(left,right,root<<1|1); else return query(left,mid,root<<1)+query(mid+1,right,root<<1|1); } } int n; int exm; int q; int flag; int lll,rrr,add; int cha; int main() { while(scanf("%d",&n)!=EOF) { buildtree(1,1,n); scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d",&flag); if(flag==1) { scanf("%d %d %d",&lll,&rrr,&add); updata(add,lll,rrr,1); } if(flag==2) { scanf("%d",&cha); printf("%d\n",query(cha,cha,1)); } } } return 0; }
相关文章推荐
- Python之Redis操作
- Android监听软键盘打开收起事件(软键盘自带收起按钮)
- VirtualBox为linux硬盘扩容
- Centos 定时压缩备份数据
- MAC忘记密码
- leetcode 376
- HDFS 的 file size 和 block size
- Oracle集成云服务Integration Cloud Service
- selenium初次应用体验
- 将16进制的数据转为数组and数组转为16进制
- Android常用五大布局属性控制
- win64下安装配置eclipse+MySQL+Tomcat
- hdu5540 Secrete Master Plan--矩阵旋转
- angularJS constant和value
- 第二讲:云分类及服务模式
- Android 坐标系和 MotionEvent 分析、滑动
- [Linux]history 显示命令执行的时间
- HDFS 文件系统
- 在CMD和Powershell中间更强大的命令行WMIC
- 配置Windows 防火墙,允许SQL Server的远程连接