#include<stdio.h>
#include<stdlib.h>
const int NN=100005;
int rom[NN]={0};
int sum;
//建立节点
typedef struct node
{
int left,right,data;
node *l_child,*r_child;
node ()
{
left=right=data=0;
}
}tree;
//建立节点
tree* build(int a,int b)
{
tree *r;
r=(tree*)malloc(sizeof(tree));
r->left=a;
r->right=b;
if(a==b)
{
r->data=rom[a];
r->l_child=NULL;
r->r_child=NULL;
}
else
{
int mid=(a+b)/2;
r->l_child=build(a,mid);
r->r_child=build(mid+1,b);
r->data=r->l_child->data+r->r_child->data;
}
return r;
}
//更新某个点
void in_sert(tree* r,int x,int w)
{
if(r->left==x&&r->right==x)
{
r->data+=w;
return ;
}
int mid=(r->left+r->right)/2;
if(x<=mid) in_sert(r->l_child,x,w);
else in_sert(r->r_child,x,w);
r->data+=w;
}
//查询区间
void find_tree(tree* r,int a,int b)
{
if(r->left==a&&r->right==b)
{
sum+=r->data;
return ;
}
int mid=(r->left+r->right)/2;
if(b<=mid) find_tree(r->l_child,a,b);
else if(a>mid) find_tree(r->r_child,a,b);
else {find_tree(r->l_child,a,mid);find_tree(r->r_child,mid+1,b);}
}
int main()
{
int n,m,i,flag,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&rom[i]);
tree* R;
R=build(1,n);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&flag,&x,&y);
if(flag==0)
{ sum=0;
find_tree(R,x,y);
printf("%d\n",sum);
}
else
{
in_sert(R,x,y);
}
}
return 0;
}
cdoj 母仪天下(线段树)
最新推荐文章于 2018-04-27 15:11:53 发布
本文介绍了一种使用C语言实现的段式树结构,包括树的建立、更新及区间查询功能。通过递归方式构建树形结构,并实现了对指定节点的数据进行修改以及查询指定区间内的数据总和。
&spm=1001.2101.3001.5002&articleId=24939233&d=1&t=3&u=6e718a3a7f554873b88caa9ae5e62fef)
781

被折叠的 条评论
为什么被折叠?



