提交时间:2024-11-12 13:47:40

运行 ID: 34633

#include<bits/stdc++.h> using namespace std; const int N = 1e5+10,md = 1e9+7; #define int long long #define double long double int n,m,a[N]; struct T{ int l; int r; int sum; int sum2; }t[N*4]; struct Q{ int op; int x; int y; int z; }q[N]; inline void pushup(int i){ t[i].sum=(t[i*2].sum%md+t[i*2+1].sum%md+md)%md; t[i].sum2=(t[i*2].sum2%md+t[i*2+1].sum2%md+md)%md; } inline void build(int i,int l,int r){ t[i].l=l; t[i].r=r; if(l==r){ t[i].sum=a[l]; t[i].sum2=a[l]%md*a[l]%md; return; } int mid=(l+r)/2; build(i*2,l,mid); build(i*2+1,mid+1,r); pushup(i); } inline void update(int i,int x,int y){ if(t[i].l==x&&t[i].r==x){ t[i].sum=y; t[i].sum2=y%md*y%md; return; } if(t[i*2].r>=x){ update(i*2,x,y); } if(t[i*2+1].l<=x){ update(i*2+1,x,y); } pushup(i); } inline int query(int i,int l,int r){ if(t[i].l>=l&&t[i].r<=r){ return t[i].sum; } int ans=0; if(t[i*2].r>=l){ ans=(ans%md+query(i*2,l,r)%md+md)%md; } if(t[i*2+1].l<=r){ ans=(ans%md+query(i*2+1,l,r)%md+md)%md; } return ans%md; } inline int query2(int i,int l,int r){ if(t[i].l>=l&&t[i].r<=r){ return t[i].sum2; } int ans=0; if(t[i*2].r>=l){ ans=(ans%md+query2(i*2,l,r)%md+md)%md; } if(t[i*2+1].l<=r){ ans=(ans%md+query2(i*2+1,l,r)%md+md)%md; } return ans%md; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } bool flag=true; for(int i=1;i<=m;i++){ int op; cin>>op; q[i].op=op; if(op==1){ cin>>q[i].x>>q[i].y; } if(op==2){ cin>>q[i].x>>q[i].y; } if(op==3){ cin>>q[i].x>>q[i].y>>q[i].z; flag=false; } if(op==4){ cin>>q[i].x>>q[i].y; } } if(n<=100&&m<=100){ for(int i=1;i<=m;i++){ if(q[i].op==1){ int ans=0; for(int j=q[i].x;j<=q[i].y;j++){ ans=(ans%md+a[j]%md+md)%md; } cout<<(ans%md+md)%md<<endl; } if(q[i].op==2){ int ans=0; for(int j=q[i].x;j<=q[i].y;j++){ ans=(ans%md+a[j]%md*a[j]%md+md)%md; } cout<<(ans%md+md)%md<<endl; } if(q[i].op==3){ for(int j=q[i].x;j<=q[i].y;j++){ int tmp=a[j]/q[i].z; double tmp2=(double)a[j]/(double)q[i].z; if(tmp2<0) a[j]=tmp-1; else a[j]=tmp; } } if(q[i].op==4){ a[q[i].x]=q[i].y; } } } else if(flag){ build(1,1,n); for(int i=1;i<=m;i++){ if(q[i].op==1){ cout<<query(1,q[i].x,q[i].y)<<endl; } if(q[i].op==2){ cout<<query2(1,q[i].x,q[i].y)<<endl; } if(q[i].op==4){ update(1,q[i].x,q[i].y); } } } return 0; }