UESTC--1730

原题链接: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 }
View Code
原文地址:https://www.cnblogs.com/i-love-acm/p/3293198.html