提交时间:2024-11-12 13:42:00
运行 ID: 34629
#include<bits/stdc++.h> using namespace std; #define N 100005 #define mod 1000000007 int n,m; long long a[N]; struct node { int l,r; long long v1,v2; }tr[N*4]; void build(int id,int l,int r){ tr[id].l=l,tr[id].r=r; if(l==r){ tr[id].v1=a[l],tr[id].v2=(a[l]*a[l])%mod; return; } int mid=(l+r)/2; build(id*2,l,mid); build(id*2+1,mid+1,r); tr[id].v1=(tr[id*2].v1+tr[id*2+1].v1+mod)%mod; tr[id].v2=(tr[id*2].v2+tr[id*2+1].v2+mod)%mod; } void change(int id,int pos,int v){ if(tr[id].l==tr[id].r){ tr[id].v1=v; tr[id].v2=(v*v)%mod; return; } int mid=(tr[id].l+tr[id].r)/2; if(pos<=mid) change(id*2,pos,v); else change(id*2+1,pos,v); tr[id].v1=(tr[id*2].v1+tr[id*2+1].v1+mod)%mod; tr[id].v2=(tr[id*2].v2+tr[id*2+1].v2+mod)%mod; } long long search(int id,int l,int r,int opt){ if(tr[id].l>=l && tr[id].r<=r){ if(opt==1) return tr[id].v1; return tr[id].v2; } long long ans=0; int mid=(tr[id].l+tr[id].r)/2; if(l<=mid) ans=(ans+search(id*2,l,r,opt)+mod)%mod; if(r>mid) ans=(ans+search(id*2+1,l,r,opt)+mod)%mod; return ans; } int main(){ //freopen("sequence.in","r",stdin); //freopen("sequence.out","w",stdout); ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; if(!(n<=120 && m<=120)) a[i]=(a[i]+mod)%mod; } if(n<=120 && m<=120){ for(int i=1;i<=m;i++){ int opt,x,y,z; long long ans=0; cin>>opt; if(opt==1){ cin>>x>>y; for(int i=x;i<=y;i++) ans=(ans+a[i]+mod)%mod; cout<<ans<<endl; }else if(opt==2){ cin>>x>>y; for(int i=x;i<=y;i++) ans=(ans+a[i]*a[i]%mod)%mod; cout<<ans<<endl; }else if(opt==3){ cin>>x>>y>>z; for(int i=x;i<=y;i++) a[i]=floor((double)a[i]/z); }else{ cin>>x>>y; a[x]=y; } } return 0; } build(1,1,n); for(int i=1;i<=m;i++){ int opt,x,y,z; cin>>opt; if(opt==1 || opt==2){ cin>>x>>y; cout<<search(1,x,y,opt)<<endl; }else if(opt==3){ cin>>x>>y>>z; }else{ cin>>x>>y; y=(y+mod)%mod; change(1,x,y); } } return 0; }