提交时间:2024-11-12 16:58:41
运行 ID: 34699
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10,md = 1e9+7; #define int long long int n,m,a[N]; struct T{ int l; int r; int sum; int sum2; int maxn; int minn; }t[N*4]; 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; t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn); t[i].minn=min(t[i*2+1].minn,t[i*2].minn); } inline void build(int i,int l,int r){ t[i].l=l; t[i].r=r; t[i].minn=1e9; t[i].maxn=-1e9; if(l==r){ t[i].sum=a[l]; t[i].sum2=a[l]%md*a[l]%md; t[i].maxn=a[l]; t[i].minn=a[l]; 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].maxn=y; t[i].minn=y; 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 void update2(int i,int x,int y){ if(t[i].l==x&&t[i].r==x){ double z=(double)t[i].maxn/(double)y; t[i].maxn=floor(z); z=(double)t[i].minn/(double)y; t[i].minn=floor(z); t[i].sum=t[i].maxn; t[i].sum2=t[i].sum%md*t[i].sum%md; return; } if(t[i*2].r>=x){ update2(i*2,x,y); } if(t[i*2+1].l<=x){ update2(i*2+1,x,y); } pushup(i); } */ inline int query(int i,int l,int r,int op){ if(t[i].l>=l&&t[i].r<=r){ if(op==1) return t[i].sum; if(op==2) return t[i].sum2; if(op==3) return t[i].maxn; if(op==4) return t[i].minn; } int ans; if(op==4) ans=1e9; else if(op==3) ans=-1e9; else ans=0; if(t[i*2].r>=l){ if(op==1||op==2){ ans=(ans%md+query(i*2,l,r,op)%md+md)%md; } else if(op==3){ ans=max(ans,query(i*2,l,r,op)); } else{ ans=min(ans,query(i*2,l,r,op)); } } if(t[i*2+1].l<=r){ if(op==1||op==2){ ans=(ans%md+query(i*2+1,l,r,op)%md+md)%md; } else if(op==3){ ans=max(ans,query(i*2+1,l,r,op)); } else{ ans=min(ans,query(i*2+1,l,r,op)); } } return ans%md; } /* inline void update3(int i,int l,int r,int x){ if(t[i].l>=l&&t[i].r<=r){ int A=query(1,t[i].l,t[i].r,3),B=query(1,t[i].l,t[i].r,4); if(A==-1&&B==-1){ if(x>=2||x<=-2){ return; } else{ t[i].maxn=1; t[i].minn=1; t[i].sum=-t[i].sum; } } else if(A==0&&B==0){ return; } else if(A==0&&B==-1){ if(x>=2||x<=-2) return; else{ for(int j=t[i].l;j<=t[i].r;j++){ update2(1,j,x); } } } else if(A==1&&B==1){ if(x>=2||x<=-2){ t[i].maxn=0; t[i].minn=0; t[i].sum=0; t[i].sum2=0; } else{ t[i].maxn=-1; t[i].minn=-1; t[i].sum=-t[i].sum; } } else if(A==1&&B==0){ if(x>=2||x<=-2){ t[i].maxn=0; t[i].minn=0; t[i].sum=0; t[i].sum2=0; } else{ t[i].maxn=0; t[i].minn=-1; t[i].sum=-t[i].sum; } } else{ for(int j=t[i].l;j<=t[i].r;j++){ update2(1,j,x); } } return; } if(t[i*2].r>=l){ update3(i*2,l,r,x); } if(t[i*2+1].l<=r){ update3(i*2+1,l,r,x); } pushup(i); } */ 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]; } build(1,1,n); for(int i=1;i<=m;i++){ int op,x,y,z; cin>>op; if(op==1){ cin>>x>>y; cout<<(query(1,x,y,op)%md+md)%md<<endl; } if(op==2){ cin>>x>>y; cout<<(query(1,x,y,op)%md+md)%md<<endl; } if(op==3){ cin>>x>>y>>z; if(z==1) continue; //update3(1,x,y,z); } if(op==4){ cin>>x>>y; update(1,x,y); } } return 0; }