Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34623 | baka24 | 【S】T3 | C++ | 通过 | 100 | 81 MS | 10172 KB | 4475 | 2024-11-12 13:38:34 |
//100 #include<bits/stdc++.h> using namespace std; #define int long long #define lson (pos<<1) #define rson (pos<<1|1) #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=200010,Mod=1000000007; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;}return rt;} int n,m,k,ans,a[MAXN]; struct node{ int sm,psm; bool tgz,tg0,tgf; node operator*(const node&G)const{ node res; res.sm=(sm+G.sm)%Mod; res.psm=(psm+G.psm)%Mod; res.tgz=tgz&G.tgz; res.tg0=tg0&G.tg0; res.tgf=tgf&G.tgf; return res; } }; struct segtree{ node t[MAXN<<2]; int lz[MAXN<<2]; void pushdown(int pos){ if(lz[pos]){ lz[lson]^=1,lz[rson]^=1; swap(t[lson].tgz,t[lson].tgf); swap(t[rson].tgz,t[rson].tgf); t[lson].sm=-t[lson].sm; t[rson].sm=-t[rson].sm; lz[pos]=0; } } void pushup(int pos){ t[pos]=t[lson]*t[rson]; } void build(int pos,int l,int r){ if(l==r){ t[pos]={a[l],a[l]*a[l]%Mod,a[l]==1,a[l]==0,a[l]==-1}; return; } int mid=(l+r)>>1; build(lson,l,mid);build(rson,mid+1,r); pushup(pos); } void update(int pos,int l,int r,int x,int y){ if(l==r){ t[pos]={y,y*y%Mod,y==1,y==0,y==-1}; return; } pushdown(pos); int mid=(l+r)>>1; if(x<=mid)update(lson,l,mid,x,y); if(x>mid)update(rson,mid+1,r,x,y); pushup(pos); } void invid(int pos,int l,int r,int ql,int qr,int x){ if(t[pos].tg0)return; if(t[pos].tgf&&x>0)return; if(l==r){ t[pos].sm=floor(1.0*t[pos].sm/x); t[pos].psm=t[pos].sm*t[pos].sm; t[pos].tgz=t[pos].sm==1; t[pos].tg0=t[pos].sm==0; t[pos].tgf=t[pos].sm==-1; return; } pushdown(pos); int mid=(l+r)>>1; if(ql<=mid)invid(lson,l,mid,ql,qr,x); if(qr>mid)invid(rson,mid+1,r,ql,qr,x); pushup(pos); } void rever(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r){ lz[pos]^=1; swap(t[pos].tgz,t[pos].tgf); t[pos].sm=-t[pos].sm; return; } pushdown(pos); int mid=(l+r)>>1; if(ql<=mid)rever(lson,l,mid,ql,qr); if(qr>mid)rever(rson,mid+1,r,ql,qr); pushup(pos); } int querysm(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r)return t[pos].sm; pushdown(pos); int mid=(l+r)>>1,res=0; if(ql<=mid)res+=querysm(lson,l,mid,ql,qr); if(qr>mid)res+=querysm(rson,mid+1,r,ql,qr); return res%Mod; } int querypsm(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r)return t[pos].psm; pushdown(pos); int mid=(l+r)>>1,res=0; if(ql<=mid)res+=querypsm(lson,l,mid,ql,qr); if(qr>mid)res+=querypsm(rson,mid+1,r,ql,qr); return res%Mod; } }T; void slv1(){ T.build(1,1,n); for(int i=1;i<=m;i++){ int op=read(),l=read(),r=read(); if(op==1)printf("%lld\n",(T.querysm(1,1,n,l,r)+Mod)%Mod); if(op==2)printf("%lld\n",(T.querypsm(1,1,n,l,r)+Mod)%Mod); if(op==3){ int x=read(); if(x==1)continue; if(x==-1)T.rever(1,1,n,l,r); else T.invid(1,1,n,l,r,x); } if(op==4)T.update(1,1,n,l,r); } } void slv2(){ for(int i=1;i<=m;i++){ int op=read(),l=read(),r=read(),res=0,x=op==3?read():0; if(op==1){ for(int i=l;i<=r;i++)res+=a[i],res%=Mod; printf("%lld\n",(res+Mod)%Mod); } if(op==2){ for(int i=l;i<=r;i++)res+=a[i]*a[i]%Mod,res%=Mod; printf("%lld\n",(res+Mod)%Mod); } if(op==3){ for(int i=l;i<=r;i++)a[i]=floor(1.0*a[i]/x); } if(op==4){ a[l]=r; } } } void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); if(n<=100&&m<=100)slv2(); else slv1(); } signed main(){ slv(); return 0; }