1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD=1e9+7; const int MAX_N=1e5+5; int a[MAX_N]; int tree[MAX_N<<2][32]; int cnt[32]; ll mod_pow(ll x,ll n) { ll res=1; while(n) { if(n&1) res=res*x%MOD; x=x*x%MOD; n>>=1; } return res%MOD; }
int lc(int x){return x<<1;} int rc(int x){return x<<1|1;}
void push_up(int p,int t) { tree[p][t]=(tree[lc(p)][t]+tree[rc(p)][t])%MOD; }
void build(int p,int l,int r) { if(l==r) { for(int i=0;i<32;i++) { tree[p][i]=(a[l]>>i)&1; } return; } int mid=(l+r)>>1; build(lc(p),l,mid); build(rc(p),mid+1,r); for(int i=0;i<32;i++) push_up(p,i); }
void query(int nl,int nr,int p,int l ,int r) { if(nl<=l&&r<=nr) { for(int i=0;i<32;i++) { cnt[i]=(cnt[i]+tree[p][i])%MOD; } return; } int mid=(l+r)>>1; if(nl<=mid) query(nl,nr,lc(p),l,mid); if(mid<nr) query(nl,nr,rc(p),mid+1,r); } void update(int nl,int nr,int p,int l ,int r,int k ) { if(nl<=l&&r<=nr) { a[l]=k; for(int i=0;i<32;i++) { tree[p][i]=(a[l]>>i)&1; } return; } int mid=(l+r)>>1; if(nl<=mid) update(nl,nr,lc(p),l,mid,k); if(mid<nr) update(nl,nr,rc(p),mid+1,r,k); for(int i=0;i<32;i++) push_up(p,i); }
int main() { int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); int m; scanf("%d",&m); while(m--) { int b; scanf("%d",&b); if(b==1){ int x,y; scanf("%d%d",&x,&y); update(x,x,1,1,n,y); } else{ memset(cnt,0,sizeof(cnt)); int l,r; scanf("%d%d",&l,&r); query(l,r,1,1,n); ll ans=0; for(int i=0;i<32;i++) { ans=(ans+(((mod_pow(2,cnt[i])-1)%MOD)*(mod_pow(2,i)%MOD))%MOD)%MOD; } printf("%lld\n",ans); } } return 0; }
|