提交时间:2024-11-12 12:42:27
运行 ID: 34597
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; const int maxn=1e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,q,a[maxn]; struct nd { int s1,s2,mx,mn; nd(){s1=s2=0,mx=-1e9,mn=1e9;} nd(int x){mx=mn=x;x=(x%mod+mod)%mod;s1=x;s2=x*1ll*x%mod;} }; nd operator+(nd a,nd b){ nd res; res.s1=(a.s1+b.s1)%mod;res.s2=(a.s2+b.s2)%mod; res.mx=max(a.mx,b.mx),res.mn=min(a.mn,b.mn); return res; } int fl(int x,int y){ if(y<0)x=-x,y=-y; if(x>=0)return x/y; if(x%y==0)return x/y; return x/y-1; } struct SegTree { nd T[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) void pu(int p){T[p]=T[ls(p)]+T[rs(p)];} bool chk(int p,int v){ if(fl(T[p].mx,v)==T[p].mx&&fl(T[p].mn,v)==T[p].mn)return 1; return 0; } void bd(int l,int r,int p){ if(l==r){ T[p]=nd(a[l]);return; }int mid=l+r>>1; bd(l,mid,ls(p)),bd(mid+1,r,rs(p));pu(p); }void modify(int l,int s,int t,int p,int x){ if(s==t){ T[p]=nd(x);return; }int mid=s+t>>1; if(l<=mid)modify(l,s,mid,ls(p),x);else modify(l,mid+1,t,rs(p),x);pu(p); }void upd(int l,int r,int s,int t,int p,int x){ if(chk(p,x))return; if(s==t){int v=T[p].mx;T[p]=nd(fl(v,x));return;} int mid=s+t>>1; if(l<=mid)upd(l,r,s,mid,ls(p),x);if(r>=mid+1)upd(l,r,mid+1,t,rs(p),x);pu(p); }int qs(int l,int r,int s,int t,int p){ if(l<=s&&t<=r) return T[p].s1; int mid=s+t>>1,res=0; if(l<=mid)res=(res+qs(l,r,s,mid,ls(p)))%mod;if(r>=mid+1)res=(res+qs(l,r,mid+1,t,rs(p)))%mod; return res; }int qss(int l,int r,int s,int t,int p){ if(l<=s&&t<=r) return T[p].s2; int mid=s+t>>1,res=0; if(l<=mid)res=(res+qss(l,r,s,mid,ls(p)))%mod;if(r>=mid+1)res=(res+qss(l,r,mid+1,t,rs(p)))%mod; return res; } }T; void slv(){ n=read(),q=read();up(i,1,n)a[i]=read(); T.bd(1,n,1); while(q--){ int op=read(); if(op==4){int x=read(),v=read();T.modify(x,1,n,1,v);continue;} int l=read(),r=read(); if(op==1){ printf("%d\n",T.qs(l,r,1,n,1));continue; }if(op==2){ printf("%d\n",T.qss(l,r,1,n,1));continue; }int p=read(); T.upd(l,r,1,n,1,p); } } int main(){ //freopen("sequence.in","r",stdin); //freopen("sequence.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }