线段树2(区间加和区间乘)
发布日期:2022-02-22 18:04:15 浏览次数:12 分类:技术文章

本文共 2432 字,大约阅读时间需要 8 分钟。

 

code:

#pragma GCC optimize("O3")// #include
#include
#include
#define int long longusing namespace std;#define ls(x) (x<<1)#define rs(x) (ls(x)|1)const int maxn=1e5+5;struct FFF{ int l,r; int sum; int add; int mul; int mid(){return l+r>>1;} int len(){return r-l+1;}}t[maxn<<2];int n,m,p;char getc(){ // return getchar(); static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)? EOF:*p1++;}int read(){ int s,f=1; char ch; while(!isdigit(ch=getc()))(ch=='-')&&(f=-1); for(s=ch-'0';isdigit(ch=getc());s=((s+(s<<2))<<1)+ch-'0'); return s*f;}void build(int l=1,int r=n,int o=1){ t[o].l=l;t[o].r=r; t[o].add=0; t[o].mul=1; if(l==r){ (t[o].sum=read())%=p; return; } int mid=l+r>>1; build(l,mid,ls(o)); build(mid+1,r,rs(o)); t[o].sum=(t[ls(o)].sum+t[rs(o)].sum)%p;}void down(int o){ int &v=t[o].add; int &f=t[o].mul; for(int i=0;i<=1;++i){ t[ls(o)|i].add=(t[ls(o)|i].add*f)%p; t[ls(o)|i].sum=(t[ls(o)|i].sum*f)%p; t[ls(o)|i].mul=(t[ls(o)|i].mul*f)%p; t[ls(o)|i].add=(t[ls(o)|i].add+v)%p; t[ls(o)|i].sum=(t[ls(o)|i].sum+v*t[ls(o)|i].len())%p; } v=0;f=1;}void add(int l,int r,int v,int o=1){ if(l<=t[o].l&&t[o].r<=r){ (t[o].sum+=(v*t[o].len())%p)%=p; (t[o].add+=v)%=p; return; } int mid=t[o].mid(); down(o); if(l<=mid)add(l,r,v,ls(o)); if(r>mid)add(l,r,v,rs(o)); t[o].sum=(t[ls(o)].sum+t[rs(o)].sum)%p;}void mul(int l,int r,int v,int o=1){ if(l<=t[o].l&&t[o].r<=r){ (t[o].sum*=v)%=p; (t[o].add*=v)%=p; (t[o].mul*=v)%=p; return; } int mid=t[o].mid(); down(o); if(l<=mid)mul(l,r,v,ls(o)); if(r>mid)mul(l,r,v,rs(o)); t[o].sum=(t[ls(o)].sum+t[rs(o)].sum)%p;}int getsum(int l,int r,int o=1){ if(l<=t[o].l&&t[o].r<=r){ return t[o].sum%=p; } int ans=0; int mid=t[o].mid(); down(o); if(l<=mid)(ans+=getsum(l,r,ls(o)))%=p; if(r>mid)(ans+=getsum(l,r,rs(o)))%=p; return ans%p;}signed main(){ n=read();m=read();p=read(); build(); while(m--){ int op=read(),l=read(),r=read(),x; if(op==1){x=read();mul(l,r,x);} if(op==2){x=read();add(l,r,x);} if(op==3){printf("%lld\n",getsum(l,r));} } return 0;}

  

转载于:https://www.cnblogs.com/eric-walker/p/9419788.html

转载地址:https://blog.csdn.net/dengxingrao0615/article/details/102231349 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:noip提高组模拟赛(QBXT)T2
下一篇:垃圾基数排序

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月25日 04时36分22秒