原题链接:http://acm.uestc.edu.cn/problem.php?pid=1730
分析:线段树单点更新,区间求和。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #define maxn 500005 7 #define mod 1000007 8 using namespace std; 9 int sum[maxn<<2]; 10 int x[maxn]; 11 void build(int l,int r,int rt) 12 { 13 if(l==r) 14 { 15 sum[rt]=x[l]; 16 return; 17 } 18 int m=(l+r)>>1; 19 build(l,m,rt<<1); 20 build(m+1,r,rt<<1|1); 21 sum[rt]=sum[rt<<1]^sum[rt<<1|1]; 22 } 23 void update(int l,int r,int rt,int ii,int v) 24 { 25 if(l==r&&l==ii){ 26 sum[rt]=v; 27 return; 28 } 29 int m=(l+r)>>1; 30 if(ii<=m)update(l,m,rt<<1,ii,v); 31 else update(m+1,r,rt<<1|1,ii,v); 32 sum[rt]=sum[rt<<1]^sum[rt<<1|1]; 33 } 34 int get_sum(int L,int R,int l,int r,int rt) 35 { 36 if(L<=l&&r<=R)return sum[rt]; 37 int m=(l+r)>>1; 38 int res=0; 39 if(L<=m)res^=get_sum(L,R,l,m,rt<<1); 40 if(R>=m+1)res^=get_sum(L,R,m+1,r,rt<<1|1); 41 return res; 42 } 43 int main() 44 { 45 int n,m; 46 cin>>n>>m; 47 for(int i=1;i<=n;i++) 48 scanf("%d",&x[i]); 49 build(1,n,1); 50 int i,j;char op[2]; 51 while(m--) 52 { 53 scanf("%s %d %d",op,&i,&j); 54 if(op[0]=='Q') 55 { 56 printf("%d ",get_sum(i,j,1,n,1)); 57 } 58 else update(1,n,1,i,j); 59 } 60 return 0; 61 }