【codevs 1081】线段树练习2(单点查询+区间修改)
来源:互联网 发布:广数系统英制螺纹编程 编辑:程序博客网 时间:2024/05/22 00:43
题目描述 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
因为没写build调了一下午。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define L(x) (x<<1)#define R(x) (x<<1|1)#define sz(x) (tree[x].r-tree[x].l+1)#define ll long longusing namespace std;const ll maxn=200000+5;ll num[maxn];ll n,q;struct edge{ ll l,r; ll add,sum;}tree[maxn<<2];void update(ll p){ tree[p].sum=tree[L(p)].sum+tree[R(p)].sum; return;}void spread(ll p){ if(!tree[p].add) return; tree[L(p)].add+=tree[p].add; tree[R(p)].add+=tree[p].add; tree[L(p)].sum+=tree[p].add*sz(L(p)); tree[R(p)].sum+=tree[p].add*sz(R(p)); tree[p].add=0; update(p); return;}void build(ll l,ll r,ll p){ tree[p].l=l,tree[p].r=r; if(l==r) { tree[p].sum=num[l]; return; } ll mid=(tree[p].l+tree[p].r)>>1; build(l,mid,L(p)); build(mid+1,r,R(p)); update(p); return;}void change(ll l,ll r,ll p,ll v){ if(l<=tree[p].l&&tree[p].r<=r) { tree[p].add+=v; tree[p].sum+=v*sz(p); return; } spread(p); ll mid=(tree[p].l+tree[p].r)>>1; if(l<=mid) change(l,r,L(p),v); if(r>mid) change(l,r,R(p),v); update(p); return;}ll ask_dd(ll w,ll p){ if(tree[p].l==tree[p].r) { return tree[p].sum; } spread(p); ll mid=(tree[p].l+tree[p].r)>>1; if(w<=mid) return ask_dd(w,L(p)); else return ask_dd(w,R(p));}ll t,a,b,x,k;int main(){ scanf("%lld",&n); memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) { scanf("%lld",&num[i]); } build(1,n,1);//!!!!!!! scanf("%lld",&q); while(q--) { scanf("%lld",&t); if(t==1) { cin>>a>>b>>x; change(a,b,1,x); } else if(t==2) { scanf("%lld",&k); cout<<ask_dd(k,1)<<'\n'; } } return 0;}
阅读全文
0 0
- 【codevs 1081】线段树练习2(单点查询+区间修改)
- 【codevs 1080】线段树练习(单点修改+区间和)
- codevs 1080 线段树练习(基本模板 单点修改区间求和)
- 线段树(单点修改,区间查询)
- 线段树(区间修改,单点查询)
- [模板练习]线段树的单点修改和区间查询
- [CodeVS1081]线段树练习2(区间修改+单点询问)
- 【数据结构】【线段树】单点修改区间查询
- HDU1166 线段树 单点修改、区间查询
- 【codevs 1082】线段树练习三(区间修改+区间和)
- codevs 1082 线段树练习 3(区间修改+区间求和)
- CODEVS 1081 线段树区间修改
- codevs 4919 线段树:区间更新,区间查询(余数)
- Wikilo 1191线段树区间修改单点查询
- POJ 2155 Matrix 二维线段树 区间修改 单点查询
- hdu 1754 线段树单点修改+区间查询
- hdu 4819 二维线段树,单点修改区间查询
- 考试 线段树二分+单点修改+区间查询
- Android系统中设置TextView的行间距
- HDU 1078 FatMouse and Cheese(记忆化搜索)
- 如何在泛型参数上进行四则运算和初识dynamic类型
- Spring MVC 入门
- DFS水题(HDU2616)
- 【codevs 1081】线段树练习2(单点查询+区间修改)
- 03-kafka配置server.properties
- EasyUi 下拉选择框onchage( )事件
- C++ function templates(1)---《C++ Templates》
- axaj异步查询学习(多级联动、校对信息)
- ubuntu mysql5.7 改变数据目录
- Ajax实现动态刷新(Post)
- Failed to execute goal maven-javadoc-plugin-----在JDK8下maven-javadoc-plugin插件报错的问题
- C++ bool,char,short,int,long,float,double数据类型大小以及数据溢出值求解