线段树 单点更新
2012-07-30 23:57
148 查看
hdu 1166 区间求和
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=50002; int sum[maxn<<2],s[maxn],n,t; char str[10]; void pushUp(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; return; } void build(int rt,int l,int r) { if(l==r) { sum[rt]=s[l]; return; } int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); pushUp(rt); } void upDate(int rt,int l,int r,int idx,int data) { if(l==r) { sum[rt]+=data; return; } int mid=(l+r)>>1; if(mid>=idx) upDate(rt<<1,l,mid,idx,data); else upDate(rt<<1|1,mid+1,r,idx,data); pushUp(rt); } int query(int rt,int l,int r,int L,int R) { if(l>=L&&r<=R) { return sum[rt]; } int mid=(l+r)>>1; int res=0; if(mid>=L) res+=query(rt<<1,l,mid,L,R); if(R>mid) res+=query(rt<<1|1,mid+1,r,L,R); return res; } int main() { scanf("%d",&t); int i,j,k,l,r,cas=1; while(t--) { scanf("%d",&n); for(i=1; i<=n; i++)scanf("%d",&s[i]); build(1,1,n); printf("Case %d:\n",cas++); while(cin>>str,(str[0]!='E')) { if(str[0]=='A') { scanf("%d%d",&l,&r); upDate(1,1,n,l,r); } else if(str[0]=='S') { scanf("%d%d",&l,&r); upDate(1,1,n,l,-r); } else if(str[0]=='Q') { scanf("%d%d",&l,&r); printf("%d\n",query(1,1,n,l,r)); } } } return 0; }
相关文章推荐
- HDU 2795 Billboard / 线段树单点更新
- hdu 4902 Nice boat(线段树区间更新lazytag·单点更新)
- hdu 1166 敌兵布阵 (线段树 单点更新 区间求和)
- Light OJ 1080 - Binary Simulation - (线段树区间更新 单点查询)
- HDU 3308 线段树单点更新+区间查找最长连续子序列
- 线段树(单点更新)/树状数组 HDOJ 1166 敌兵布阵
- 线段树 (单点更新)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- 线段树大模板(区间更新,单点更新,查询区间最值等等)
- [ACM] hdu 1754 I Hate It (线段树,单点更新)
- hdoj 1541 Stars【线段树单点更新+最大值维护】
- Hdu1166单点更新线段树
- poj 2886 Who Gets the Most Candies? 【线段树单点更新 + 反素数】
- hdu1754 单点更新+求区间最值(线段树)
- ny 123 士兵杀敌(四)-- 线段树(区间更新,单点查询)
- 线段树 --- (单点更新、区间最值、模板题)
- HDU 1166 线段树基础题目单点更新
- 线段树版(单点更新,区间查询)
- hdu1166 线段树单点更新区间查询
- HDU 1540 Tunnel Warfare(线段树单点更新+区间合并)