题解:
树状数组PUIQ(点更新,段求和)裸题
代码:
#include<bits/stdc++.h> using namespace std; #define LL long long const int N=50010; int n; int a[N],c[N]; char line[20]; int lowbit(int x){return x&(-x);} void add(int x,int v){ int cnt=x; while(cnt<N){ c[cnt]+=v; cnt+=lowbit(cnt); } } int sum(int x){ int ans=0,cnt=x; while(cnt){ ans+=c[cnt]; cnt-=lowbit(cnt); } return ans; } int main(){ int T,Case=1,p,q; scanf("%d",&T); while(T--){ memset(c,0,sizeof(c)); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); add(i,a[i]); } printf("Case %d:\n",Case++); while(scanf("%s",line)&&line[0]!=‘E‘){ scanf("%d%d",&p,&q); if(line[0]==‘Q‘) printf("%d\n",sum(q)-sum(p-1)); if(line[0]==‘A‘) add(p,q); if(line[0]==‘S‘) add(p,0-q); } } }
时间: 2024-10-04 06:15:05