#include<iostream>
#include<cstring>
using namespace std;
#define max_size 4000005
#define mod 571373
#define ll long long
ll ans[max_size],a[max_size],tag[max_size],tag2[max_size];
#define lp p<<1
#define rp p<<1|1/*乘2+1*/
#define mid ((l+r)>>1)
void build(int l,int r,int p){
if(l==r)ans[p]=a[l];
else {
build(l,mid,lp);
build(mid+1,r,rp);
ans[p]=(ans[lp]+ans[rp])%mod;
}
}
inline void push_down(int p,int l,int r){
tag2[lp]=tag2[lp]%mod*tag2[p]%mod;
tag2[rp]=tag2[rp]%mod*tag2[p]%mod;
ans[lp]=ans[lp]%mod*tag2[p]%mod;
ans[rp]=ans[rp]%mod*tag2[p]%mod;
tag2[p]=1;
ans[lp]%=mod;
ans[rp]%=mod;
tag[lp]+=tag[p];
tag[rp]+=tag[p];
ans[lp]+=tag[p]%mod*(mid-l+1)%mod;
ans[rp]+=tag[p]%mod*(r-mid)%mod;
tag[p]=0;//标记下传
ans[lp]%=mod;
ans[rp]%=mod;
}
inline void push_up(int p){
ans[p]=ans[lp]+ans[rp];
ans[p]%=mod;
}
inline void update(int nl,int nr,int l,int r,int p,int k){
if(nl<=l&&nr>=r/*区间被叶子包含*/){
ans[p]+=(r-l+1)*k;
ans[p]%=mod;
tag[p]+=k;
tag[p]%=mod;
return;
}push_down(p,l,r);
if(nl<=mid)update(nl,nr,l,mid,lp,k);
if(nr>mid)update(nl,nr,mid+1,r,rp,k);
push_up(p);
}
inline void update2(int nl,int nr,int l,int r,int p,int k){
if(nl<=l&&nr>=r/*区间被叶子包含*/){
ans[p]*=k;
tag2[p]*=k;
tag[p]*=k;
tag[p]%=mod;/*乘法标记更新时加法标记也要更新*/
tag2[p]%=mod;
ans[p]%=mod;
return;
}push_down(p,l,r);
if(nl<=mid)update2(nl,nr,l,mid,lp,k);
if(nr>mid)update2(nl,nr,mid+1,r,rp,k);
push_up(p);
}
ll query(int ql,int qr,int l,int r,int p){
if(ql<=l&&qr>=r){
return ans[p]%mod;
}ll res=0;
push_down(p,l,r);/*区间拆分要下传标记*/
if(ql<=mid)res+=query(ql,qr,l,mid,lp)%mod;
if(qr>mid)res+=query(ql,qr,mid+1,r,rp)%mod;
return res%mod;
}int main(){
int c,d,i;
cin>>c>>d>>i;
for(int i=0;i<max_size;i++)tag2[i]=1;/*乘法标记初始化*/
for(int i=1;i<=c;i++){
cin>>a[i];
}build(1,c,1);
for(int i=1;i<=d;i++){
int t;
cin>>t;
switch (t) {
case 1:
ll x,y,k;
cin>>x>>y>>k;
update2(x,y,1,c,1,k%mod);
break;
case 2:
cin>>x>>y>>k;
update(x,y,1,c,1,k%mod);
break;
case 3:
cin>>x>>y;
cout<<query(x,y,1,c,1)%mod<<endl;
break;
}
}
}
只过了#1 #3 #4