#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 母仪天下(线段树)
最新推荐文章于 2019-09-28 10:59:41 发布