线段树+等差数列
题目链接:https://ac.nowcoder.com/acm/contest/5157/C

1 #include <bits/stdc++.h> 2 using namespace std; 3 #define mod 111546435 4 #define inv 55773218 5 6 const int MAXN=200000+10; 7 struct node{ 8 int l,r; 9 long long a,d; 10 long long val; 11 }tree[MAXN<<2]; 12 long long arr[MAXN]; 13 int n,q; 14 15 void build(int pos,int l,int r){ 16 tree[pos].l=l,tree[pos].r=r; 17 if(l==r){ 18 tree[pos].val=arr[l]; 19 return; 20 } 21 int mid=l+r>>1; 22 build(pos<<1,l,mid); 23 build(pos<<1|1,mid+1,r); 24 tree[pos].val=(tree[pos<<1].val+tree[pos<<1|1].val)%mod; 25 } 26 27 inline void pushdown(int pos){ 28 long long a=tree[pos].a; 29 long long d=tree[pos].d; 30 if(!a&&!d)return; 31 long long e=a+(tree[pos<<1].r-tree[pos<<1].l)*d; 32 tree[pos<<1].val=(tree[pos<<1].val+(a+e)%mod*(tree[pos<<1].r-tree[pos<<1].l+1)%mod*inv)%mod; 33 tree[pos<<1].a=(tree[pos<<1].a+a)%mod; 34 tree[pos<<1].d=(tree[pos<<1].d+d)%mod; 35 a=(tree[pos<<1|1].l-tree[pos<<1].l)*d+a; 36 e=(tree[pos<<1|1].r-tree[pos<<1|1].l)*d+a; 37 tree[pos<<1|1].val=(tree[pos<<1|1].val+(a+e)%mod*(tree[pos<<1|1].r-tree[pos<<1|1].l+1)%mod*inv)%mod; 38 tree[pos<<1|1].a=(tree[pos<<1|1].a+a)%mod; 39 tree[pos<<1|1].d=(tree[pos<<1|1].d+d)%mod; 40 tree[pos].a=tree[pos].d=0; 41 } 42 43 void update(int pos,long long a,long long d,int l,int r){ 44 if(tree[pos].l>=l&&tree[pos].r<=r){ 45 long long s=a+(tree[pos].l-l)*d; 46 long long e=a+(tree[pos].r-l)*d; 47 tree[pos].val=(tree[pos].val+(s+e)%mod*(tree[pos].r-tree[pos].l+1)%mod*inv)%mod; 48 tree[pos].a=(tree[pos].a+s)%mod; 49 tree[pos].d=(tree[pos].d+d)%mod; 50 return; 51 } 52 pushdown(pos); 53 int mid=tree[pos].l+tree[pos].r>>1; 54 if(mid>=l)update(pos<<1,a,d,l,r); 55 if(mid<r)update(pos<<1|1,a,d,l,r); 56 tree[pos].val=(tree[pos<<1].val+tree[pos<<1|1].val)%mod; 57 } 58 59 long long query(int pos,int l,int r){ 60 if(tree[pos].l>=l&&tree[pos].r<=r)return tree[pos].val; 61 pushdown(pos); 62 tree[pos].val=(tree[pos<<1].val+tree[pos<<1|1].val)%mod; 63 int mid=tree[pos].l+tree[pos].r>>1; 64 long long ans=0; 65 if(mid>=l)ans+=query(pos<<1,l,r); 66 if(mid<r)ans+=query(pos<<1|1,l,r); 67 return ans%mod; 68 } 69 70 int main(){ 71 scanf("%d",&n); 72 for(int i=1;i<=n;i++)scanf("%lld",arr+i); 73 build(1,1,n); 74 scanf("%d",&q); 75 while(q--){ 76 int p; 77 scanf("%d",&p); 78 if(p==1){ 79 int l,r; 80 long long a,d; 81 scanf("%d%d%lld%lld",&l,&r,&a,&d); 82 update(1,a,d,l,r); 83 }else{ 84 int l,r; 85 long long m; 86 scanf("%d%d%lld",&l,&r,&m); 87 printf("%lld\n",query(1,l,r)%m); 88 } 89 } 90 return 0; 91 }