#include <bits/stdc++.h>
#define ll long long
#define ls (now*2)
#define rs ((now*2)+1)
#define mid ((l+r)/2)
using namespace std;
const ll modd=571373,maxn=400010;
ll sum[maxn],lazy1[maxn],lazy2[maxn];
void add(ll &x,ll y) { x=((x%modd)+(y%modd))%modd; return; }
void mul(ll &x,ll y) { x=((x%modd)*(y%modd))%modd; return; }
void up(ll now) { sum[now]=(sum[ls]+sum[rs])%modd; return; }
void work(ll now,ll l,ll r,ll j,ll c)
{
mul(sum[now],c);add(sum[now],(j*(r-l+1))%modd);
mul(lazy1[now],c);mul(lazy2[now],c);
add(lazy1[now],j);
}
void pd(ll now,ll l,ll r)
{
work(ls,l,mid,lazy1[now],lazy2[now]);
work(rs,mid+1,r,lazy1[now],lazy2[now]);
lazy1[now]=0;lazy2[now]=1;
}
void cheng(ll now,ll l,ll r,ll L,ll R,ll val)
{
if(L<=l&&r<=R) { mul(sum[now],val); mul(lazy1[now],val); mul(lazy2[now],val); return; }
pd(now,l,r);
if(L<=mid) cheng(ls,l,mid,L,R,val); if(R>mid) cheng(rs,mid+1,r,L,R,val);
up(now);
return;
}
void jia(ll now,ll l,ll r,ll L,ll R,ll val)
{
if(L<=l&&r<=R) { add(sum[now],(val*(r-l+1))%modd); add(lazy1[now],val); return; }
pd(now,l,r);
if(L<=mid) jia(ls,l,mid,L,R,val); if(R>mid) jia(rs,mid+1,r,L,R,val);
up(now);
return;
}
ll cha(ll now,ll l,ll r,ll L,ll R)
{
lazy2[now]=max(lazy2[now],1LL);
if(L<=l&&r<=R) return sum[now];
pd(now,l,r);
ll ret=0;
if(L<=mid) add(ret,cha(ls,l,mid,L,R)); if(R>mid) add(ret,cha(rs,mid+1,r,L,R));
return ret;
}
ll n,q,m;
int main()
{
cin>>n>>q>>m;
for(int i=0;i<maxn;i++) lazy2[i]=1;
for(ll i=1;i<=n;i++)
{
ll a;cin>>a;
jia(1,1,n,i,i,a);
}
while(q--)
{
ll e,x,y;
cin>>e>>x>>y;
if(e==1)
{
ll k;cin>>k;
cheng(1,1,n,x,y,k%modd);
}
else if(e==2)
{
ll k;cin>>k;
jia(1,1,n,x,y,k%modd);
}
else cout<<cha(1,1,n,x,y)<<"\n";
}
return 0;
}
记录详情