提交时间:2024-11-12 12:44:00

运行 ID: 34599

#include<bits/stdc++.h> #define int long long using namespace std; const int mod=1e9+7; int dvd(int x,int y){ if(x<0&&y>0)return -((-x+y-1)/y); if(x>0&&y<0)return -((x-y-1)/-y); if(x<0&&y<0)return -x/-y; return x/y; } int n,m,a[100005]; void read(int &x){ x=0; char c=getchar(); bool f=0; while(!isdigit(c)){if(c=='-')f=1;c=getchar();} while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x; } int sum[400005],sqrsum[400005]; bool all[400005],all0[400005],all1[400005],lz[400005]; #define ls (p<<1) #define rs (p<<1|1) #define mid (l+r>>1) inline void pu(int p){ sum[p]=sum[ls]+sum[rs]; sqrsum[p]=sqrsum[ls]+sqrsum[rs]; all[p]=(all[ls]&&all[rs]); // all0[p]=(all0[ls]&&all0[rs]); all1[p]=(all1[ls]&&all1[rs]); sum[p]%=mod; sqrsum[p]%=mod; } void bd(int l,int r,int p){ if(l==r){ sum[p]=a[l]; sqrsum[p]=a[l]*a[l]; all[p]=(a[l]==0||a[l]==-1); // all0[p]=(a[l]==0); // cout<<l<<" "<<a[l]<<endl; all1[p]=(a[l]==0||a[l]==1); return; } bd(l,mid,ls); bd(mid+1,r,rs); pu(p); } inline void tr(int p){ lz[p]^=1; sum[p]=-sum[p]; swap(all[p],all1[p]); } inline void pd(int p){ if(!lz[p])return; tr(ls),tr(rs); lz[p]=0; return; } void upd(int l,int r,int id,int x,int p){ if(l==r){ sum[p]=x; sqrsum[p]=x*x%mod; all[p]=(x==0||x==-1); // all0[p]=(x==0); all1[p]=(x==0||x==1); return; } pd(p); if(mid>=id)upd(l,mid,id,x,ls); else upd(mid+1,r,id,x,rs); pu(p); } void upd(int l,int r,int ml,int mr,int x,int p){ // cout<<l<<" "<<r<<" "<<sum[p]<<" "<<all[p]<<" "<<all1[p]<<endl; if(all[p])return; // cout<<l<<" "<<r<<endl; if(l==r){ sum[p]=dvd(sum[p],x); sqrsum[p]=sum[p]*sum[p]; all[p]=(sum[p]==0||sum[p]==-1); all1[p]=(sum[p]==0||sum[p]==1); return; } pd(p); if(mid>=ml)upd(l,mid,ml,mr,x,ls); if(mid<mr)upd(mid+1,r,ml,mr,x,rs); pu(p); } void upd1(int l,int r,int ml,int mr,int p){ if(ml<=l&&r<=mr){ tr(p); return; } pd(p); if(mid>=ml)upd1(l,mid,ml,mr,ls); if(mid<mr)upd1(mid+1,r,ml,mr,rs); pu(p); } int qu1(int l,int r,int ml,int mr,int p){ if(ml<=l&&r<=mr)return sum[p]; int res=0; pd(p); if(mid>=ml)res+=qu1(l,mid,ml,mr,ls),res%=mod; if(mid<mr)res+=qu1(mid+1,r,ml,mr,rs),res%=mod; return res; } int qu2(int l,int r,int ml,int mr,int p){ if(ml<=l&&r<=mr)return sqrsum[p]; int res=0; pd(p); if(mid>=ml)res+=qu2(l,mid,ml,mr,ls),res%=mod; if(mid<mr)res+=qu2(mid+1,r,ml,mr,rs),res%=mod; return res; } void prt(int l,int r,int p){ if(l==r){ cout<<l<<" "<<sum[p]<<" "<<all[p]<<" "<<all1[p]<<endl; return; } prt(l,mid,ls); prt(mid+1,r,rs); } signed main(){ read(n),read(m); for(int i=1;i<=n;i++)read(a[i]); bd(1,n,1); while(m--){ int op; read(op); if(op==1){ int l,r; read(l),read(r); printf("%lld\n",(qu1(1,n,l,r,1)+mod)%mod); } else if(op==2){ int l,r; read(l),read(r); printf("%lld\n",(qu2(1,n,l,r,1)+mod)%mod); } else if(op==3){ int l,r,p; read(l),read(r),read(p); if(p<0)upd1(1,n,l,r,1),p=-p; if(p!=1)upd(1,n,l,r,p,1); } else{ int p,x; read(p),read(x); upd(1,n,p,x,1); } // cout<<"!"<<endl; // prt(1,n,1); } return 0; }