在单纯的更新结点时,是不需要用到遗传结构的
在区间的更新时,会用到遗传结构
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
#include<string.h>
struct data
{
int l,r,val;
}st[200009];
void build(int ll,int rr,int n)
{
st[n].l=ll;
st[n].r=rr;
st[n].val=0;
if (ll==rr) return ;
int mid=(ll+rr)/2;
build(ll,mid,2*n);
build(mid+1,rr,2*n+1);
}
void updata(int ll,int rr,int a,int n,char c)//
{
if (st[n].l==ll&&st[n].r==rr)
{
if(c=='+')
st[n].val+=a;
else
st[n].val-=a;
return ;
}
if(c=='+')
st[n].val+=a;
else
st[n].val-=a;
int mid=(st[n].l+st[n].r)/2;
if (rr<=mid)
{
updata(ll,rr,a,2*n,c);
}
else if (ll>=mid+1) updata(ll,rr,a,2*n+1,c);
else
{
updata(ll,mid,a,2*n,c);
updata(mid+1,rr,a,2*n+1,c);
}
}
int search(int ll,int rr,int n)
{
if(st[n].l==ll&&st[n].r==rr)return st[n].val;
int mid=(st[n].l+st[n].r)/2;
if (rr<=mid) return search(ll,rr,2*n);
else if (ll>=mid+1)return search(ll,rr,2*n+1);
else
{
return search(ll,mid,2*n)+search(mid+1,rr,2*n+1);
}
}
int main()
{
int t;
scanf("%d",&t);
int cc=1;
while(t--)
{
printf("Case %d:\n",cc);
cc++;
int n;
scanf("%d",&n);
int i;
build(1,n,1);
for(i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
updata(i,i,temp,1,'+');
}
getchar();
char ss[10];
while(1)
{
scanf("%s",ss);
getchar();
if(strcmp(ss,"Query")==0)
{
int ll,rr;
scanf("%d%d",&ll,&rr);
printf("%d\n",search(ll,rr,1));
}
else if(strcmp(ss,"Add")==0)
{
int no,addv;
scanf("%d%d",&no,&addv);
updata(no,no,addv,1,'+');
}
else if(strcmp(ss,"Sub")==0)
{
int no,addv;
scanf("%d%d",&no,&addv);
updata(no,no,addv,1,'-');
}
else
{
break;
}
}
}
return 0;
}
#include<string.h>
struct data
{
int l,r,val;
}st[200009];
void build(int ll,int rr,int n)
{
st[n].l=ll;
st[n].r=rr;
st[n].val=0;
if (ll==rr) return ;
int mid=(ll+rr)/2;
build(ll,mid,2*n);
build(mid+1,rr,2*n+1);
}
void updata(int ll,int rr,int a,int n,char c)//
{
if (st[n].l==ll&&st[n].r==rr)
{
if(c=='+')
st[n].val+=a;
else
st[n].val-=a;
return ;
}
if(c=='+')
st[n].val+=a;
else
st[n].val-=a;
int mid=(st[n].l+st[n].r)/2;
if (rr<=mid)
{
updata(ll,rr,a,2*n,c);
}
else if (ll>=mid+1) updata(ll,rr,a,2*n+1,c);
else
{
updata(ll,mid,a,2*n,c);
updata(mid+1,rr,a,2*n+1,c);
}
}
int search(int ll,int rr,int n)
{
if(st[n].l==ll&&st[n].r==rr)return st[n].val;
int mid=(st[n].l+st[n].r)/2;
if (rr<=mid) return search(ll,rr,2*n);
else if (ll>=mid+1)return search(ll,rr,2*n+1);
else
{
return search(ll,mid,2*n)+search(mid+1,rr,2*n+1);
}
}
int main()
{
int t;
scanf("%d",&t);
int cc=1;
while(t--)
{
printf("Case %d:\n",cc);
cc++;
int n;
scanf("%d",&n);
int i;
build(1,n,1);
for(i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
updata(i,i,temp,1,'+');
}
getchar();
char ss[10];
while(1)
{
scanf("%s",ss);
getchar();
if(strcmp(ss,"Query")==0)
{
int ll,rr;
scanf("%d%d",&ll,&rr);
printf("%d\n",search(ll,rr,1));
}
else if(strcmp(ss,"Add")==0)
{
int no,addv;
scanf("%d%d",&no,&addv);
updata(no,no,addv,1,'+');
}
else if(strcmp(ss,"Sub")==0)
{
int no,addv;
scanf("%d%d",&no,&addv);
updata(no,no,addv,1,'-');
}
else
{
break;
}
}
}
return 0;
}