Topic Portal
Problem-solving ideas:
A segment tree template title, nothing to say .qwq
AC Code:
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 long long n,m,p; 7 long long a[100001]; 8 struct kkk { 9 long long v,mul,add; 10 }e[400005]; 11 12 inline void build(int bh,int l,int r) { 13 e[bh].mul = 1; 14 e[bh].add = 0; 15 if(l == r) { 16 e[bh].v = a[l] % p; 17 return ; 18 } 19 int mid = l + r >> 1; 20 build(bh * 2,l,mid); 21 build(bh * 2 + 1,mid + 1,r); 22 e[bh].v = e[bh*2].v + e[bh*2+1].v; 23 e[bh].v %= p; 24 return ; 25 } 26 27 inline Void pushdown ( int s, int d, int b) { 28 int mid = (l + r) >> 1 ; 29 he [was * 2 ] .v = (a [of * 2 ] * .v he [was] + .mul he [was] .add * (half rate - l + 1 ))% p; 30 he [was * 2 + 1 ] .v = (a [of * 2 + 1 ] * .v he [was] + .mul he [was] .add * (r - half rate))% p; 31 he [was * 2 ] = .mul (he [was * 2 ] * .mul he [was] .mul)%p; 32 he [was * 2 + 1 ] = .mul (he [was * 2 + 1 ] * .mul he [was] .mul)% p; 33 he [was * 2 ] = .add (he [was * 2 ] * .add it [was] + .mul he [was] .add)% p; 34 he [was * 2 + 1 ] = .add (he [was * 2 + 1 ] * .add it [was] + .mul he [was] .add)% p; 35 he [was] .mul = 1 ; 36 he [was] .add = 0 ; 37 return ; 38 } 39 40 inline void update_Multiply(int bh,int ll,int rr,int l,int r,long long _v) { 41 if(r < ll || l > rr) 42 return ; 43 if(l <= ll && r >= rr) { 44 e[bh].v = (e[bh].v * _v) % p; 45 e[bh].mul = (e[bh].mul * _v) % p; 46 e[bh].add = (e[bh].add * _v) % p; 47 return ; 48 } 49 pushdown(bh,ll,rr); 50 int mid = (ll + rr) >> 1; 51 update_Multiply(bh * 2,ll,mid,l,r,_v); 52 update_Multiply(bh * 2 + 1,mid + 1,rr,l,r,_v); 53 e[bh].v = (e[bh*2].v + e[bh*2+1].v) % p; 54 return ; 55 } 56 57 inline void update_Plus(int bh,int ll,int rr,int l,int r,long long _v) { 58 if(r < ll || rr < l) 59 return ; 60 if(l <= ll && r >= rr) { 61 e[bh].add = (e[bh].add + _v) % p; 62 e[bh].v = (e[bh].v + _v * (rr - ll + 1)) % p; 63 return ; 64 } 65 pushdown(bh,ll,rr); 66 int mid = (ll + rr) >> 1; 67 update_Plus(bh * 2,ll,mid,l,r,_v); 68 update_Plus(bh * 2 + 1,mid + 1,rr,l,r,_v); 69 e[bh].v = (e[bh*2].v + e[bh*2+1].v) % p; 70 return ; 71 } 72 73 long long query(int bh,int ll,int rr,int l,int r) { 74 if(r < ll || l > rr) 75 return 0; 76 if(l <= ll && r >= rr) 77 return e[bh].v; 78 pushdown(bh,ll,rr); 79 int mid = (ll + rr) >> 1; 80 return (query(bh * 2,ll,mid,l,r) + query(bh * 2 + 1,mid + 1,rr,l,r)) % p; 81 } 82 83 int main() 84 { 85 scanf("%lld%lld",&n,&p); 86 for(int i = 1;i <= n; i++) 87 scanf("%lld",&a[i]); 88 build(1,1,n); 89 scanf("%lld",&m); 90 while(m--) { 91 int u,x,y; 92 long long k; 93 scanf("%d",&u); 94 if(u == 1) { 95 scanf("%d%d%lld",&x,&y,&k); 96 update_Multiply(1,1,n,x,y,k); 97 } 98 if(u == 2) { 99 scanf("%d%d%lld",&x,&y,&k); 100 update_Plus(1,1,n,x,y,k); 101 } 102 if(u == 3) { 103 scanf("%d%d",&x,&y); 104 printf("%lld\n",query(1,1,n,x,y) % p); 105 } 106 } 107 return 0; 108 }