样例没过求调

P3373 【模板】线段树 2

ask函数也要pushdown ```cpp #include<cstdio> #include<algorithm> using namespace std; #define lll long long inline lll in(){ lll x=0,f=1;char c; c=getchar(); while (c<'0'||c>'9'){ if (c=='-')f=-1; c=getchar(); } while (c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,m,q; lll a[100005]; struct node{lll val,add,mul;}tree[400005]; inline void build(int k,int l,int r){ tree[k].mul=1; if (l==r){tree[k].val=a[l];return ;} int mid=l+r>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); tree[k].val=(tree[k<<1].val+tree[k<<1|1].val)%m; } inline void pushdown(int k,int l,int r){ int mid=l+r>>1; tree[k<<1].val=(tree[k<<1].val*tree[k].mul+tree[k].add*(mid-l+1))%m; tree[k<<1|1].val=(tree[k<<1|1].val*tree[k].mul+tree[k].add*(r-mid))%m; tree[k<<1].mul=tree[k<<1].mul*tree[k].mul%m; tree[k<<1|1].mul=tree[k<<1|1].mul*tree[k].mul%m; tree[k<<1].add=(tree[k<<1].add*tree[k].mul%m+tree[k].add)%m; tree[k<<1|1].add=(tree[k<<1|1].add*tree[k].mul%m+tree[k].add)%m; tree[k].mul=1;tree[k].add=0; } inline void update1(int k,int l,int r,int ll,int rr,long long x){ if (ll<=l&&r<=rr){ tree[k].val=(tree[k].val*x)%m; tree[k].add=(tree[k].add*x)%m; tree[k].mul=(tree[k].mul*x)%m; return ; } pushdown(k,l,r); int mid=l+r>>1; if (ll<=mid)update1(k<<1,l,mid,ll,rr,x); if (rr>mid)update1(k<<1|1,mid+1,r,ll,rr,x); tree[k].val=(tree[k<<1].val+tree[k<<1|1].val)%m; } inline void update2(int k,int l,int r,int ll,int rr,long long x){ if (ll<=l&&r<=rr){ tree[k].val=(tree[k].val+x*(r-l+1)%m)%m; tree[k].add=(tree[k].add+x)%m; return ; } pushdown(k,l,r); int mid=l+r>>1; if (ll<=mid)update2(k<<1,l,mid,ll,rr,x); if (rr>mid)update2(k<<1|1,mid+1,r,ll,rr,x); tree[k].val=(tree[k<<1].val+tree[k<<1|1].val)%m; } inline lll ask(int k,int l,int r,int ll,int rr){ if (ll<=l&&r<=rr)return tree[k].val; int mid=l+r>>1; pushdown(k,l,r); lll ans=0; if (ll<=mid)ans+=ask(k<<1,l,mid,ll,rr); if (rr>mid)ans+=ask(k<<1|1,mid+1,r,ll,rr); ans%=m; return ans; } int main(){ n=in(),q=in(),m=in(); for (int i=1;i<=n;i++)a[i]=in()%m; build (1,1,n); while (q--){ int op=in(),x=in(),y=in(); if (op==1)update1(1,1,n,x,y,in()); else if (op==2)update2(1,1,n,x,y,in()); else printf ("%lld\n",ask(1,1,n,x,y)); } return 0; } ```
by Forebear @ 2023-10-08 22:56:05


@[ryf20100124](/user/761649)
by whssy @ 2023-10-08 23:15:52


@[Forebear](/user/576008) %%%
by 2024yourfather @ 2023-10-08 23:29:00


@[Forebear](/user/576008) 谢谢大佬
by ryf20100124 @ 2023-10-09 12:05:45


|