Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34641 武云帆 【S】T3 C++ 运行超时 9 1000 MS 5104 KB 2950 2024-11-12 14:01:24

Tests(2/22):


#include<bits/stdc++.h> #define int long long #define ls(x) (x<<1) #define rs(x) (x<<1|1) using namespace std; struct node{ int sum; int sum2; }t[4000050]; const int mod=1e9+7; int n,m; int a[100010]; void push_up(int u){ t[u].sum=t[ls(u)].sum+t[rs(u)].sum; t[u].sum%=mod; t[u].sum2=t[ls(u)].sum2+t[rs(u)].sum2; t[u].sum2%=mod; } void build(int u,int l,int r){ if(l==r){ t[u].sum=a[l]%mod; t[u].sum2=a[l]*a[l]%mod; return; } int mid=(l+r)>>1; build(ls(u),l,mid); build(rs(u),mid+1,r); push_up(u); } long long ans=0; void find1(int u,int l,int r,int x,int y){ if(x<=l&&r<=y){ ans=(ans+t[u].sum+mod)%mod; return; } int mid=(l+r)>>1; if(x<=mid) find1(ls(u),l,mid,x,y); if(y>mid) find1(rs(u),mid+1,r,x,y); } void find2(int u,int l,int r,int x,int y){ //cout<<u<<"!!!"<<l<<" "<<r<<" "; if(x<=l&&r<=y){ ans=(ans+t[u].sum2+mod)%mod; //cout<<u<<"!"<<l<<" "<<r<<" "<<t[u].sum2<<endl; return; } int mid=(l+r)>>1; //cout<<mid<<endl; if(x<=mid) find2(ls(u),l,mid,x,y); if(y>mid) find2(rs(u),mid+1,r,x,y); } void remove(int u,int l,int r,int x,int v){ if(l==r){ t[u].sum=v%mod; t[u].sum2=v*v%mod; return; } int mid=(l+r)>>1; if(x<=mid) remove(ls(u),l,mid,x,v); else remove(rs(u),mid+1,r,x,v); push_up(u); } signed main(){ //freopen("sequence.in","r",stdin); //freopen("sequence.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; if(n>100||m>100) build(1,1,n); int z=m; int l,r,p; while(m--){ int op; cin>>op; if(op==1){ cin>>l>>r; ans=0; if(n<=100&&z<=100){ for(int i=l;i<=r;i++){ ans=(ans+a[i]+mod)%mod; } cout<<(ans+mod)%mod<<endl; } else{ find1(1,1,n,l,r); cout<<(ans+mod)%mod<<endl; } } if(op==2){ cin>>l>>r; ans=0; if(n<=100&&z<=100){ for(int i=l;i<=r;i++){ ans=(ans+a[i]*a[i]%mod+mod)%mod; } cout<<(ans+mod)%mod<<endl; } else{ //cout<<ans<<endl; find2(1,1,n,l,r); //cout<<"@@@@@@"<<endl; //for(int i=1;i<=2*n;i++) cout<<t[i].sum<<" "<<t[i].sum2<<endl; //cout<<op<<":"<<l<<" "<<r<<" "<<ans<<endl; cout<<(ans+mod)%mod<<endl; } } if(op==3){ cin>>l>>r>>p; for(int i=l;i<=r;i++) a[i]=a[i]/p; } if(op==4){ cin>>l>>r; a[l]=r; remove(1,1,n,l,r); } } }


测评信息: