Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34666 | LYLAKIOIAKIOI | 【S】T3 | C++ | 解答错误 | 63 | 108 MS | 7564 KB | 3717 | 2024-11-12 15:14:30 |
#include<bits/stdc++.h> using namespace std; const int N=1e5+10,mod=1e9+7; int n,m; int a[N]; int Div(int a,int b){ int f=(a<0)^(b<0),v=0; if(f) v=(abs(a)+abs(b)-1)/abs(b); else v=abs(a)/abs(b); f=1-2*f; return f*v; } struct ask{ int op,l,r,v; }Q[N]; void slv1(){ while(m--){ int op,l,r,v; cin>>op>>l>>r;if(op==3) cin>>v; if(op==1){ int ans=0; for(int j=l;j<=r;j++){ ans=(ans+a[j])%mod; }cout<<(ans+mod)%mod<<endl; }if(op==2){ int ans=0; for(int j=l;j<=r;j++){ ans=(ans+1ll*a[j]*a[j]%mod)%mod; }cout<<(ans+mod)%mod<<endl; }if(op==3){ for(int j=l;j<=r;j++){ a[j]=Div(a[j],v); } }if(op==4){ a[l]=r; } } } struct segtree{ #define ls p*2 #define rs p*2+1 #define mid (l+r)/2 int T[N<<2],sq[N<<2],c0[N<<2],c1[N<<2],c2[N<<2],tg[N<<2]; void pu(int p){ T[p]=(T[ls]+T[rs])%mod; sq[p]=(sq[ls]+sq[rs])%mod; c0[p]=c0[ls]+c0[rs]; c1[p]=c1[ls]+c1[rs]; c2[p]+c2[ls]+c2[rs]; }void pd(int p){ if(tg[p]){ tg[ls]^=1;tg[rs]^=1; tg[p]=0; T[ls]=-T[ls],T[rs]=-T[rs]; swap(c1[ls],c2[ls]);swap(c1[rs],c2[rs]); } }void bd(int p,int l,int r){ if(l==r){ T[p]=a[l]; sq[p]=1ll*a[l]*a[l]%mod; if(a[l]==-1) c2[p]=1; if(a[l]==0) c0[p]=1; if(a[l]==1) c1[p]=1; return ; }bd(ls,l,mid);bd(rs,mid+1,r);pu(p); }void upd(int p,int l,int r,int x,int v){ if(l==r){ T[p]=v;sq[p]=1ll*v*v%mod; c0[p]=(v==0);c1[p]=(v==1);c2[p]=(v==-1); return ; }pd(p);if(x<=mid) upd(ls,l,mid,x,v); else upd(rs,mid+1,r,x,v);pu(p); }void rev(int p,int l,int r,int pl,int pr){ if(pl<=l&&r<=pr){ tg[p]=1;T[p]=-T[p]; swap(c1[p],c2[p]);return ; }pd(p); if(pl<=mid) rev(ls,l,mid,pl,pr); if(pr>mid) rev(rs,mid+1,r,pl,pr);pu(p); }int qrys(int p,int l,int r,int pl,int pr){ if(pl<=l&&r<=pr) return T[p]; int res=0;pd(p); if(pl<=mid) res+=qrys(ls,l,mid,pl,pr); if(pr>mid) res+=qrys(rs,mid+1,r,pl,pr); return (res%mod+mod)%mod; }int qrysq(int p,int l,int r,int pl,int pr){ if(pl<=l&&r<=pr) return sq[p]; int res=0;pd(p); if(pl<=mid) res+=qrysq(ls,l,mid,pl,pr); if(pr>mid) res+=qrysq(rs,mid+1,r,pl,pr); return (res%mod+mod)%mod; }void div(int p,int l,int r,int pl,int pr,int v){ if(l==r){ T[p]=Div(T[p],v); sq[p]=1ll*T[p]*T[p]%mod; c0[p]=(T[p]==0);c1[p]=(T[p]==1);c2[p]=(T[p]==-1); return ; }pd(p); if(c0[p]+c2[p]==r-l+1) return ; div(ls,l,mid,pl,pr,v);div(rs,mid+1,r,pl,pr,v); pu(p); } }sgt; void slv2(){ sgt.bd(1,1,n); while(m--){ int op,l,r,v; cin>>op>>l>>r;if(op==3) cin>>v; if(op==1){ cout<<(sgt.qrys(1,1,n,l,r)+mod)%mod<<'\n'; }if(op==2){ int ans=0; cout<<(sgt.qrysq(1,1,n,l,r)+mod)%mod<<'\n'; }if(op==3){ sgt.div(1,1,n,l,r,v); }if(op==4){ sgt.upd(1,1,n,l,r); } }cout.flush(); } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; if(n<=110&&m<=110) slv1(); else slv2(); return 0; }