线段树入门 单点更新区间查询 南阳oj 116
2017-09-12 10:15
423 查看
线段树入门基础题,直接模板单点更新区间查询,下面贴AC代码:
#include<stdio.h>
int a[3000000];
void build(int l,int r,int node)
{
if(l==r)
{
scanf("%d",&a[node]);
return;
}
int m=(l+r)/2;
build(l,m,node*2);
build(m+1,r,node*2+1);
a[node]=a[node*2]+a[node*2+1];
}
int query(int ql,int qr,int l,int r,int node)
{
if(l>=ql&&r<=qr)
return a[node];
int m,ans=0;
m=(l+r)/2;
if(m<ql)
ans+=query(ql,qr,m+1,r,node*2+1);
else if(m>=qr)
ans+=query(ql,qr,l,m,node*2);
else
{
ans+=query(ql,qr,m+1,r,node*2+1);
ans+=query(ql,qr,l,m,node*2);
}
return ans;
}
void update(int l,int r,int k,int add,int node)
{
a[node]+=add;
if(l==r)
return;
int m=(l+r)/2;
if(m<k)
update(m+1,r,k,add,node*2+1);
else
update(l,m,k,add,node*2);
}
int main()
{
int n,m,i;
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--)
{
int l,r,k,add;
char s[10];
scanf("%s",s);
if(s[0]=='Q')
{
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r,1,n,1));
}
else
{
scanf("%d%d",&k,&add);
update(1,n,k,add,1);
}
}
}
相关文章推荐
- 线段树入门 区间更新 单点查询 南阳oj 123
- HDU 1166 敌兵布阵 (线段树单点更新+区间查询入门)
- 南阳oj 123 树状数组入门 区间更新 单点求值
- nyoj116 士兵杀敌(二)(线段树的区间查询和单点更新)
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
- HDU - 1540Tunnel Warfare(线段树 单点更新 区间查询)
- hdu 3308 线段树 区间合并+单点更新+区间查询
- hdoj 4339 线段树 单点更新,区间查询
- HDU3074: Multiply game(线段树单点更新,区间查询)
- 线段树 单点更新查询 区间最大值 hdu 2795 Billboard
- HDU 3874 Necklace (线段树单点更新+区间查询+离线操作)
- Necklace (线段树单点更新+区间查询+离线操作)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- POJ 3928 线段树 单点更新+区间查询
- HDU1754线段树单点更新区间查询(数组版)
- NYOJ 123 士兵杀敌(四)(线段树--区间更新+单点查询)
- 数据结构--M - 秋实大哥与线段树(单点更新与区间查询)
- HDU 1556 给连续个球涂色-线段树-(区间更新,单点查询)
- ZOJ - 1610 Count the Colors (线段树单点查询 区间更新)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)