题目:HDU 1166
#include <iostream>
#include<cstring>
#define max 100007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using namespace std;
int Sum[max<<2];
int Add[max<<2];
int A[max];
int n;
void PushUp(int rt)
{
Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];
}
void Build(int l,int r,int rt)
{
if(l==r)
{
Sum[rt]=A[l];
return ;
}
int m=(l+r)>>1;
Build(ls);
Build(rs);
PushUp(rt);
}
void PushDown(int ln,int rn,int rt)
{
if(Add[rt])
{
Add[rt<<1]+=Add[rt];
Add[rt<<1|1]+=Add[rt];
Sum[rt<<1]+=ln*Add[rt];
Sum[rt<<1|1]+=rn*Add[rt];
Add[rt]=0;
}
}
void Update(int L,int R,int C,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
Add[rt]+=C;
Sum[rt]+=(r-l+1)*C;
return ;
}
int m=(l+r)>>1;
//PushDown(m-l+1,r-m,rt);//这里可以不写
if(L<=m)
Update(L,R,C,ls);
if(m<R)
Update(L,R,C,rs);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
return Sum[rt];
else
{
int m=(l+r)>>1;
PushDown(m-l+1,r-m,rt);
int ans=0;
if(L<=m)
ans+=Query(L,R,ls);
if(R>m)
ans+=Query(L,R,rs);
return ans;
}
}
int cnt=1;
int main()
{
int T;
cin>>T;
while(T--)
{
memset(Sum,0,sizeof(Sum));
memset(Add,0,sizeof(Add));
cout<<"Case "<<cnt++<<":"<<endl;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
Build(1,n,1);
string s;
int x,y;
while(cin>>s)
{
if(s[0]=='E')
break;
if(s[0]=='Q')
{
cin>>x>>y;
cout<<Query(x,y,1,n,1)<<endl;
}
if(s[0]=='A')
{
cin>>x>>y;
Update(x,x,y,1,n,1);
}
if(s[0]=='S')
{
cin>>x>>y;
Update(x,x,-y,1,n,1);
}
}
}
}
本题板子,来自:https://blog.csdn.net/zearot/article/details/48299459