#include <bits/stdc++.h>
#define maxn 200010
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using namespace std;
int Sum[maxn<<2],Lazy[maxn<<2];
int A[maxn];
void PushUp(int rt){Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];}
int N,Q,lq,rq,val;
void Build(int l,int r,int rt){
if(l==r) {
Sum[rt] = A[l];
return;
}
int m=(l+r)>>1;
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
PushUp(rt);
}
void UpdatePoint(int L,int C,int l,int r,int rt){
if(l==r){
Sum[rt]+=C;
return;
}
int m=(l+r)>>1;
if(L <= m) UpdatePoint(L,C,l,m,rt<<1);
else UpdatePoint(L,C,m+1,r,rt<<1|1);
PushUp(rt);
}
void PushDown(int rt,int ln,int rn){
if(Lazy[rt]){
Lazy[rt<<1] = Lazy[rt];
Lazy[rt<<1|1] = Lazy[rt];
Sum[rt<<1] = Lazy[rt]*ln;
Sum[rt<<1|1] = Lazy[rt]*rn;
Lazy[rt]=0;
}
}
void UpdateInterval(int L,int R,int C,int l,int r,int rt){
if(L <= l && r <= R){
Sum[rt] = C*(r-l+1);
Lazy[rt] = C;
return ;
}
int m=(l+r)>>1;
PushDown(rt,m-l+1,r-m);
if(L <= m) UpdateInterval(L,R,C,l,m,rt<<1);
if(R > m) UpdateInterval(L,R,C,m+1,r,rt<<1|1);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
return Sum[rt];
}
int m = (l+r)>>1;
PushDown(rt,m-l+1,r-m);
int ANS = 0;
if(L <= m) ANS += Query(L,R,l,m,rt<<1);
if(R > m) ANS += Query(L,R,m+1,r,rt<<1|1);
return ANS;
}
int main()
{
int n,t;
char ss[20];
cin>>t;
for(int i = 1;i<=t;++i){
printf("Case %d:\n",i);
cin>>n;
for(int j=1;j<=n;j++) cin>>A[j];
Build(1,n,1);
while(scanf("%s",ss) && ss[0] != 'E'){
if(ss[0] == 'Q'){
int L,R;
scanf("%d%d",&L,&R);
printf("%d\n",Query(L,R,1,n,1));
}else if(ss[0] == 'A'){
int L,c;
scanf("%d%d",&L,&c);
UpdatePoint(L,c,1,n,1);
}else if(ss[0] == 'S'){
int L,c;
scanf("%d%d",&L,&c);
UpdatePoint(L,-c,1,n,1);
}
}
}
return 0;
}
HDOJ 1166 敌兵布阵(线段树 单点更新 区间求和)
猜你喜欢
转载自blog.csdn.net/qq_37360631/article/details/81462235
今日推荐
周排行