该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
是一个线段树的问题,我看了别人的代码 有些地方不明白
现在主要是x&(-x)不知道什么意思
整体代码
#include
#include
#include
#include
using namespace std;
int ss[50005];
int n;
int lowbit(int x)
{
return x&(-x);
}
void update(int pos,int num){
while(pos<=n){
ss[pos]+=num;
//printf("%d\n",ss[pos]);
pos+=lowbit(pos);
}
//printf("%d\n",ss[pos]);
}
int sum(int a){
int total=0;
while(a>0){
total+=ss[a];
a-=lowbit(a);
}
return total;
}
int main(){
int kk,j;
scanf("%d",&kk);
for(j=1;j<=kk;++j){
memset(ss,0,sizeof(ss));
printf("Case %d:\n",j);
int x;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&x);
update(i,x);
}
string s;
while(cin>>s){
int a,b;
if(s=="Query"){
scanf("%d%d",&a,&b);
int x=sum(b)-sum(a-1);
printf("%d\n",x);
}
if(s=="Add"){
scanf("%d%d",&a,&b);
update(a,b);
}
if(s=="Sub"){
scanf("%d%d",&a,&b);
update(a,-b);
}
if(s=="End"){
break;
}
}
}
return 0;
}