Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34646 | A21μΘ_wjy | 【S】T3 | C++ | 运行超时 | 45 | 1000 MS | 16656 KB | 3546 | 2024-11-12 14:29:12 |
#include<bits/stdc++.h> #define int long long #define doub long double #define PII pair<int,int> #define fir first #define sec second #define mp make_pair #define lc(p) ((p)<<1) #define rc(p) ((p)<<1|1) using namespace std; const int mod=1e9+7; const int maxn=1e5+7; int n,m; int a[maxn]; inline int D(int x,int p){ doub d=(x*1.0)/(p*1.0); return (int)floorl(d); } struct SGT{ struct Node{ int S1,S2,Max,Min,NG; Node(int v=0){S1=v,S2=v*v%mod,Max=Min=v,NG=1;} }d[maxn<<2]; inline void Pu(int p){ d[p].S1=((d[lc(p)].S1+d[rc(p)].S1)%mod+mod)%mod; d[p].S2=(d[lc(p)].S2+d[rc(p)].S2)%mod; d[p].Max=max(d[lc(p)].Max,d[rc(p)].Max); d[p].Min=min(d[lc(p)].Min,d[rc(p)].Min); } inline void Calc(int p){ d[p].S1=-d[p].S1; int Max=d[p].Max,Min=d[p].Min; d[p].Max=-Min; d[p].Min=-Max; d[p].NG=-d[p].NG; } inline void Pd(int p){ if(d[p].NG==1)return; Calc(lc(p)),Calc(rc(p)); d[p].NG=1; } inline void B(int p,int l,int r){ // cout<<p<<" "<<l<<" "<<r<<endl; if(l==r)return void(d[p]=Node(a[l])); d[p].NG=1;int mid=l+r>>1; B(lc(p),l,mid);B(rc(p),mid+1,r); Pu(p); } inline void Rev(int p,int l,int r,int L,int R){//for operate 3,case p=-1 if(L<=l&&r<=R)return Calc(p); Pd(p);int mid=l+r>>1; if(L<=mid)Rev(lc(p),l,mid,L,R); if(R>mid)Rev(rc(p),mid+1,r,L,R); Pu(p); } inline void Dec(int p,int l,int r,int L,int R,int v){// let v>0 if(r<L||l>R)return; if(l==r){ int c=d[p].S1; c=D(c,v); d[p]=Node(c);return; } Pd(p); if((d[p].Max==d[p].Min)&&(d[p].Max==0))return; // if(v>0)if(d[p].Max<=0&&d[p].Min==-1)return; // else if(v<0)if(d[p].Min>=0&&d[p].Max==1)return void(Calc(p)); int mid=l+r>>1; Dec(lc(p),l,mid,L,R,v);Dec(rc(p),mid+1,r,L,R,v); Pu(p); } inline PII Q(int p,int l,int r,int L,int R){ if(L<=l&&r<=R)return mp(d[p].S1,d[p].S2); Pd(p);int mid=l+r>>1; PII ret=mp(0,0); if(L<=mid){ PII Pl=Q(lc(p),l,mid,L,R); ret.fir+=Pl.fir;ret.fir%=mod; ret.sec+=Pl.sec;ret.sec%=mod; } if(R>mid){ PII Pr=Q(rc(p),mid+1,r,L,R); ret.fir+=Pr.fir;ret.fir%=mod; ret.sec+=Pr.sec;ret.sec%=mod; } ret.fir%=mod;ret.fir+=mod;ret.fir%=mod; return ret; } inline void U(int p,int l,int r,int x,int dt){ if(l==r)return void(d[p]=Node(dt)); Pd(p); int mid=l+r>>1; if(x<=mid)U(lc(p),l,mid,x,dt); if(x>mid)U(rc(p),mid+1,r,x,dt); Pu(p); } }T; signed main(){ios::sync_with_stdio(0);cin.tie(0); cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; T.B(1,1,n); while(m--){ int op; cin>>op; if(op==1||op==2){ int l,r;cin>>l>>r; PII p=T.Q(1,1,n,l,r); if(op==1)cout<<p.fir<<endl; else cout<<p.sec<<endl; } if(op==3){ int l,r,p;cin>>l>>r>>p; if(p==1)continue; else if(p==-1)T.Rev(1,1,n,l,r); else T.Dec(1,1,n,l,r,p); } if(op==4){ int x,dt;cin>>x>>dt; T.U(1,1,n,x,dt); } } cout.flush();return 0; }