#include<iostream>#include<cstring>#include<cstdio>
using namespace std;
const int N=5e4+5;
int sum[N<<2],lazy[N<<2];
int a[N],n;
void pushup(int x){
sum[x]=sum[x<<1]+sum[x<<1|1];}
void pushdown(int x,int suml,int sumr){if(lazy[x]){
lazy[x<<1]+=lazy[x];
lazy[x<<1|1]+=lazy[x];
sum[x<<1]+=suml*lazy[x];
sum[x<<1|1]+=sumr*lazy[x];
lazy[x]=0;}}
void build(int x,int l,int r){if(l==r){
sum[x]=a[l];return;}
int mid=l+r>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);pushup(x);}
void update(int x,int l,int r,int tem,int val)//单点更新
{if(l==r){
sum[x]+=val;return;}
int mid=l+r>>1;pushdown(x,mid-l+1,r-mid);if(tem<=mid)update(x<<1,l,mid,tem,val);elseupdate(x<<1|1,mid+1,r,tem,val);pushup(x);}
void update2(int x,int L,int R,int l,int r,int val)//区间更新
{if(L<=l && r<=R){
sum[x]+=val*(r-l+1);
lazy[x]+=val;return;}
int mid=l+r>>1;pushdown(x,mid-l+1,r-mid);if(L<=mid)update(x<<1,L,R,l,mid,val);if(R>mid)update(x<<1|1,L,R,mid+1,r,val);pushup(x);}
int query(int x,int l,int r,int tem)//点查询
{if(l==r)return sum[x];
int mid=l+r>>1;if(tem<=mid)returnquery(x<<1,l,mid,tem);elsereturnquery(x<<1|1,mid+1,r,tem);}
int query2(int x,int L,int R,int l,int r){if(L<=l&&r<=R)return sum[x];
int mid=l+r>>1;pushdown(x,mid-l+1,r-mid);
int ans=0;if(L<=mid)
ans+=query(x<<1,L,R,l,mid);if(R>mid)
ans+=query(x<<1|1,L,R,mid+1,r);return ans;}
2.基础树状数组模板(点更新+区间查询)
#include<iostream>#include<cstring>#include<cstdio>
using namespace std;
const int N=5e4+10;
int a[N],c[N];
int n;
int lowbit(int x){return x&(-x);}
void add(int x,int val){while(x<=n){
c[x]+=val;
x+=lowbit(x);}}
int get_sum(int x){
int ans=0;while(x>0){
ans+=c[x];
x-=lowbit(x);}return ans;}
int main(){
int t,cas=1;
cin>>t;while(t--){
cin>>n;memset(c,0,sizeof c);for(int i=1;i<=n;i++){
int x;scanf("%d",&x);add(i,x);}
string s;printf("Case %d:\n",cas++);while(cin>>s){if(s=="End")break;if(s=="Query"){
int l,r;scanf("%d%d",&l,&r);
cout<<get_sum(r)-get_sum(l-1)<<endl;}else{
int x,val;scanf("%d%d",&x,&val);if(s=="Sub")
val=-val;add(x,val);}}}return0;}