大意就不说了。中文题目。除非你是外星人。拉倒吧,你肯定不是
线段树的单点更新。query求的是一段内的SUM
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 50005
using namespace std;
int tree[MAXN<<2];
void build(int num,int l,int r)
{
tree[num]=0;
if(l==r)return;
int mid=(l+r)>>1;
build(num<<1,l,mid);
build(num<<1|1,mid+1,r);
}
void insert(int num,int s,int e,int pos,int val)
{
int mid=(s+e)>>1;
if(s==e)
{
tree[num]+=val;
return;
}
if(pos<=mid)
insert(num<<1,s,mid,pos,val);
else
insert(num<<1|1,mid+1,e,pos,val);
tree[num]=tree[num<<1] + tree[num<<1|1];
}
int query(int num,int s,int e,int l,int r)
{
int mid=(s+e)>>1;
if(s==l && r==e)return tree[num];
if(r<=mid)
return query(num<<1,s,mid,l,r);
else
{
if(l>mid)
return query(num<<1|1,mid+1,e,l,r);
else
return query(num<<1,s,mid,l,mid) + query(num<<1|1,mid+1,e,mid+1,r);
}
}
int main()
{
int T;
int CASE=1;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
build(1,1,n);
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&t);
insert(1,1,n,i,t);
}
char str[10];
printf("Case %d:\n",CASE++);
while(~scanf("%s",str))
{
if(str[0]=='E')break;
int a,b;
scanf("%d%d",&a,&b);
switch(str[0]){
case 'A':insert(1,1,n,a,b);break;
case 'S':insert(1,1,n,a,-b);break;
case 'Q':
{
printf("%d\n",query(1,1,n,a,b));
break;
}
}
}
}
}
树状数组也来一发
#include <iostream>
#include <cstdio>
using namespace std;
int n,C[50005],A[50005];
inline int lowbit(int x)
{
return x&-x;
}
void SZinit()
{
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
C[i]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=i-lowbit(i)+1;j<=i;j++)
C[i]+=A[j];
}
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=C[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int d)
{
while(x<=n)
{
C[x]+=d;
x+=lowbit(x);
}
}
int main()
{
int T;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
scanf("%d",&n);
SZinit();
char op[20];
printf("Case %d:\n",cas);
while(scanf("%s",op)!=EOF)
{
if(op[0]=='E')break;
else if(op[0]=='Q')
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",sum(r)-sum(l-1));
}
else if(op[0]=='A')
{
int l,r;
scanf("%d%d",&l,&r);
add(l,r);
}
else if(op[0]=='S')
{
int l,r;
scanf("%d%d",&l,&r);
add(l,-r);
}
}
}
return 0;
}