提交时间:2024-11-12 15:47:59
运行 ID: 34682
#include<bits/stdc++.h> using namespace std; #define N 100005 #define mod 1000000007 #define ll long long #define mmm (tr[id].l+tr[id].r)/2 ll mmod(ll x){ while (x<0) { x+=mod; } return x%mod; } int n,m; ll a[N]; struct node { int l,r,mx,mn; ll v1,v2; bool lazy; }tr[N*4]; bool lf(int id){ return tr[id].l==tr[id].r; } void mt(int id){ tr[id].v1=(tr[id*2].v1+tr[id*2+1].v1)%mod; tr[id].v2=(tr[id*2].v2+tr[id*2+1].v2)%mod; tr[id].mn=min(tr[id*2].mn,tr[id*2+1].mn); tr[id].mx=max(tr[id*2].mx,tr[id*2+1].mx); } void pushdown(int id){ if(tr[id].lazy){ tr[id*2].mn*=-1,tr[id*2].mx*=-1,swap(tr[id*2].mn,tr[id*2].mx); tr[id*2].v1*=-1; tr[id*2].lazy^=1; tr[id*2+1].mn*=-1,tr[id*2+1].mx*=-1,swap(tr[id*2+1].mn,tr[id*2+1].mx); tr[id*2+1].v1*=-1; tr[id*2+1].lazy^=1; tr[id].lazy=0; } } void build(int id,int l,int r){ tr[id].l=l,tr[id].r=r,tr[id].lazy=0; if(lf(id)){ tr[id].mn=tr[id].mx=tr[id].v1=a[l]; tr[id].v2=a[l]*a[l]; return; } int mid=mmm; build(id*2,l,mid); build(id*2+1,mid+1,r); mt(id); } void change(int id,int pos,ll val){ if(lf(id)){ tr[id].mn=tr[id].mx=tr[id].v1=val; tr[id].v2=val*val%mod; return; } int mid=mmm; if(pos<=mid) change(id*2,pos,val); else change(id*2+1,pos,val); mt(id); } void upd(int id,int l,int r,int p){ if(p==1) return; if(lf(id) && (tr[id].mn!=0 || tr[id].mx!=0)){ tr[id].mn=floor((double)tr[id].mn/p); tr[id].mx=floor((double)tr[id].mx/p); tr[id].v1=floor((double)tr[id].v1/p); tr[id].v2=(tr[id].v1*tr[id].v1)%mod; return; } if(tr[id].l>=l && tr[id].r<=r){ if(tr[id].mn==0 && tr[id].mx==0){ return; } if(p==-1){ tr[id].mn*=-1,tr[id].mx*=-1,swap(tr[id].mn,tr[id].mx); tr[id].v1*=-1; tr[id].lazy^=1; return; } if(tr[id].mn==-1 && tr[id].mx==-1 && p>0){ return; } } pushdown(id); int mid=mmm; if(l<=mid) upd(id*2,l,r,p); if(r>mid) upd(id*2+1,l,r,p); mt(id); } ll search(int id,int l,int r,int opt){ if(lf(id)){ if(opt==1){ return tr[id].v1; }else{ return tr[id].v2; } } pushdown(id); int mid=mmm; ll res=0; if(l<=mid) res=mmod(res+search(id*2,l,r,opt)); if(r>mid) res=mmod(res+search(id*2+1,l,r,opt)); return res; } int main(){ ios::sync_with_stdio(false); 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 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; upd(1,x,y,z); }else{ cin>>x>>y; change(1,x,y); } } return 0; }