1 条题解
-
1WiFi LV 8 @ 2018-08-04 12:39:28
#include<bits/stdc++.h> using namespace std; const int maxn=100001; long long p; long long a[maxn]; int n,m; struct node{ int l,r; long long s,add,mul; }tr[3*maxn]; void pushdown(int k){ if(tr[k].mul!=1){ tr[2*k].add*=tr[k].mul; tr[2*k].add%=p; tr[2*k+1].add*=tr[k].mul; tr[2*k+1].add%=p; tr[2*k].mul*=tr[k].mul; tr[2*k].mul%=p; tr[2*k+1].mul*=tr[k].mul; tr[2*k+1].mul%=p; tr[2*k].s*=tr[k].mul; tr[2*k].s%=p; tr[2*k+1].s*=tr[k].mul; tr[2*k+1].s%=p; tr[k].mul=1; } if(tr[k].add){ tr[2*k].add+=tr[k].add; tr[2*k].add%=p; tr[2*k+1].add+=tr[k].add; tr[2*k+1].add%=p; tr[2*k].s+=tr[k].add*(tr[2*k].r-tr[2*k].l+1); tr[2*k].s%=p; tr[2*k+1].s+=tr[k].add*(tr[2*k+1].r-tr[2*k+1].l+1); tr[2*k+1].s%=p; tr[k].add=0; } } void pushup(int k){ tr[k].s=(tr[2*k].s+tr[2*k+1].s)%p; } void build(int k,int l,int r){ tr[k].l=l,tr[k].r=r,tr[k].add=0; if(l==r) {tr[k].s=a[l]%p;return ;} int mid=(l+r)>>1; build(k*2,l,mid); build(k*2+1,mid+1,r); pushup(k); } void update(int k,int x,int y,long long c,bool t){ if(x>tr[k].r||y<tr[k].l) return; if(x<=tr[k].l&&y>=tr[k].r) { if(t==0){ tr[k].add+=c; tr[k].add%=p; tr[k].s+=c*(tr[k].r-tr[k].l+1); tr[k].s%=p; }else{ tr[k].mul*=c; tr[k].mul%=p; tr[k].add*=c; tr[k].add%=p; tr[k].s*=c; tr[k].s%=p; } return; } pushdown(k); update(2*k,x,y,c,t); update(2*k+1,x,y,c,t); pushup(k); } long long query(int k,int x,int y){ if(x>tr[k].r||y<tr[k].l) return 0; if(x<=tr[k].l&&y>=tr[k].r) return tr[k].s; pushdown(k); // pushup(k); return (query(2*k,x,y)+query(2*k+1,x,y))%p; } int main(){ cin>>n>>p; for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=300000;i++) tr[i].mul=1; build(1,1,n); cin>>m; for(int i=1;i<=m;i++){ int t,x,y; long long c; scanf("%d",&t); if(t==1) { scanf("%d%d%lld",&x,&y,&c); update(1,x,y,c,1); } else if(t==2){ scanf("%d%d%lld",&x,&y,&c); update(1,x,y,c,0); } else{ scanf("%d%d",&x,&y); printf("%lld\n",query(1,x,y)%p); } } }
- 1
信息
- 难度
- 10
- 分类
- (无)
- 标签
- 递交数
- 12
- 已通过
- 0
- 通过率
- 0%
- 被复制
- 1
- 上传者