思路:树状数组或线段树 模板题。。。
Code :
//树状数组
#include
using namespace std;
const int MAX_N=50005;
int n,T;
int a[MAX_N],c[MAX_N];
int Lowbit(int x);
void Update(int id,int x);
int Sum(int id);
int main()
{
ios::sync_with_stdio(false);
cin>>T;
for(int t=1;t<=T;++t)
{
cin>>n;
for(int i=1;i<=n;c[i]=0,++i)
cin>>a[i];
for(int i=1;i<=n;++i)
Update(i,a[i]);
cout<<"Case "<>str&&str!="End"){
if(str=="Add"){
cin>>l>>x;
Update(l,x);
}else if(str=="Sub"){
cin>>l>>x;
Update(l,-x);
}else if(str=="Query"){
cin>>l>>r;
cout<0){
ans+=c[id];
id-=Lowbit(id);
}
return ans;
}
Code :
//线段树
#include
using namespace std;
const int MAX_N=50005;
int n,T;
int a[MAX_N];
int Tree[MAX_N<<2];
void PushUp(int id);
void Build(int l,int r,int id);
void Update(int t,int x,int l,int r,int id);
int Query(int l,int r,int L,int R,int id);
int main()
{
ios::sync_with_stdio(false);
cin>>T;
for(int t=1;t<=T;++t)
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
Build(1,n,1);
cout<<"Case "<>str&&str!="End"){
if(str=="Add"){
cin>>l>>x;
a[l]+=x;
Update(l,a[l],1,n,1);
}else if(str=="Sub"){
cin>>l>>x;
a[l]-=x;
Update(l,a[l],1,n,1);
}else if(str=="Query"){
cin>>l>>r;
cout<>1;
Build(l,h,id<<1);
Build(h+1,r,id<<1|1);
PushUp(id);
}
void Update(int t,int x,int l,int r,int id)
{
if(l==r){
Tree[id]=x;
return;
}
int h=(l+r)>>1;
if(h>=t) Update(t,x,l,h,id<<1);
else Update(t,x,h+1,r,id<<1|1);
PushUp(id);
}
int Query(int L,int R,int l,int r,int id)
{
if(L<=l&&R>=r) return Tree[id];
int h=(l+r)>>1,ans=0;
if(L<=h) ans+=Query(L,R,l,h,id<<1);
if(R>h) ans+=Query(L,R,h+1,r,id<<1|1);
return ans;
}