题目:https://www.luogu.org/problemnew/show/P3373
AC代码:
1 #include<bits/stdc++.h> 2 #include<vector> 3 #include<cstring> 4 #include<iostream> 5 #include<cstdio> 6 #define ll unsigned long long 7 using namespace std;; 8 //const ll mod=1e9+7; 9 const ll maxn=1000010; 10 ll tree[maxn<<2]; 11 ll lz[maxn<<2],lz1[maxn<<2]; 12 ll mod; 13 void build(ll l,ll r,ll p) 14 {lz[p]=1;lz1[p]=0; 15 if(l==r) 16 { 17 scanf("%lld",&tree[p]); 18 return ; 19 } 20 ll mid=(l+r)>>1; 21 build(l,mid,p<<1); 22 build(mid+1,r,p<<1|1); 23 tree[p]=(tree[p<<1]+tree[p<<1|1])%mod; 24 } 25 void down(ll l,ll r,ll p) 26 {ll mid=(l+r)>>1; 27 lz[p<<1]=(lz[p<<1]*lz[p])%mod; 28 lz[p<<1|1]=(lz[p<<1|1]*lz[p])%mod; 29 lz1[p<<1]=(lz1[p]+lz1[p<<1]*lz[p])%mod; 30 lz1[p<<1|1]=(lz1[p]+lz1[p<<1|1]*lz[p])%mod; 31 tree[p<<1]=(tree[p<<1]*lz[p]+(mid-l+1)*lz1[p])%mod; 32 tree[p<<1|1]=(tree[p<<1|1]*lz[p]+(r-mid)*lz1[p])%mod; 33 lz[p]=1; 34 lz1[p]=0; 35 } 36 void add(ll l,ll r,ll x,ll y,ll p,ll k) 37 { 38 if(x<=l&&y>=r) 39 { 40 tree[p]=(tree[p]+(r-l+1)*k)%mod; 41 lz1[p]=(lz1[p]+k)%mod; 42 return ; 43 } 44 down(l,r,p); 45 ll mid=(l+r)>>1; 46 if(x<=mid)add(l,mid,x,y,p<<1,k); 47 if(y>mid) add(mid+1,r,x,y,p<<1|1,k); 48 tree[p]=tree[p<<1]+tree[p<<1|1]; 49 } 50 void mu(ll l,ll r,ll x,ll y,ll p,ll k) 51 { 52 if(x<=l&&y>=r) 53 { 54 tree[p]=(tree[p]*k)%mod; 55 lz[p]=(lz[p]*k)%mod; 56 lz1[p]=(lz1[p]*k)%mod; 57 return ; 58 } 59 down(l,r,p); 60 ll mid=(l+r)>>1; 61 if(x<=mid)mu(l,mid,x,y,p<<1,k); 62 if(y>mid) mu(mid+1,r,x,y,p<<1|1,k); 63 tree[p]=tree[p<<1]+tree[p<<1|1]; 64 } 65 ll sum(ll x,ll y,ll l,ll r,ll p) 66 { ll ans=0; 67 if(x<=l&&y>=r) 68 { 69 return tree[p]%mod; 70 } 71 down(l,r,p); 72 ll mid=(l+r)>>1; 73 if(x<=mid)ans=(ans+sum(x,y,l,mid,p<<1))%mod; 74 if(y>mid) ans=(ans+sum(x,y,mid+1,r,p<<1|1))%mod; 75 return ans%mod; 76 } 77 void prll(ll l,ll r,ll p) 78 { 79 if(l==r) 80 { 81 82 return ; 83 } 84 down(l,r,p); 85 ll mid=(l+r)>>1; 86 prll(l,mid,p<<1); 87 prll(mid+1,r,p<<1|1); 88 89 } 90 int main() 91 { 92 ll n,m; 93 cin>>n>>m>>mod; 94 build(1,n,1); 95 while(m--) 96 { 97 ll a; 98 scanf("%lld",&a); 99 if(a==1) 100 { 101 ll x,y,k; 102 scanf("%lld%lld%lld",&x,&y,&k); 103 mu(1,n,x,y,1,k); 104 105 } 106 else if(a==2) 107 { 108 109 ll x,y,k; 110 scanf("%lld%lld%lld",&x,&y,&k); 111 add(1,n,x,y,1,k); 112 113 } 114 else 115 { ll x,y;scanf("%lld%lld",&x,&y); 116 printf("%lld ",sum(x,y,1,n,1)); 117 118 } 119 120 } 121 }