现代码:
#include<bits/stdc++.h>
#define MOD 571373
using namespace std;
void IOS()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return;
}
typedef long long ll;
ll n,m,p,sqn,x,y,z,cnt;
ll bg[325],ed[325],sm[325],ml[325],pl[325];
ll c[100005],bl[100005];
void print()
{
cout<<"c:"<<endl;
for(ll i=1;i<=n;i++) cout<<c[i]<<" ";
cout<<endl;
cout<<" bgn end sum mul pls"<<endl;
for(ll i=1;i<=cnt;i++)
cout<<setw(5)<<bg[i]<<" "<<setw(5)<<ed[i]<<" "<<setw(5)<<sm[i]<<" "<<setw(5)<<ml[i]<<" "<<setw(5)<<pl[i]<<endl;
return;
}
void rst(ll kkk)
{
for(ll i=bg[kkk];i<=ed[kkk];i++)
c[i]=(c[i]*ml[kkk]+pl[kkk])%MOD;
ml[kkk]=1,pl[kkk]=0;
return;
}
int main()
{
IOS();
cin>>n>>m>>p;
sqn=sqrt(n);
for(ll i=1;i<=sqn;i++)
{
bg[i]=(i-1)*sqn+1;
ed[i]=i*sqn;
ml[i]=1;
}
if(sqn*sqn<n)
{
bg[sqn+1]=sqn*sqn+1;
ed[sqn+1]=n;
ml[sqn+1]=1;
}
cnt=1;
for(ll i=1;i<=n;i++)
{
cin>>c[i];
if(i>ed[cnt]) cnt++;
bl[i]=cnt;
sm[cnt]+=c[i];
}
while(m--)
{
cin>>p>>x>>y;
ll kkk=bl[x],cz=bl[y];
if(p==1)
{
cin>>z;
z%=MOD;
rst(kkk);
for(ll i=x;i<=min(y,ed[kkk]);i++)
{
sm[kkk]=(sm[kkk]+(z-1)*c[i])%MOD;
c[i]=(c[i]*z)%MOD;
}
if(kkk!=cz)
{
rst(cz);
for(ll i=bg[cz];i<=y;i++)
{
sm[cz]=(sm[cz]+(z-1)*c[i])%MOD;
c[i]=(c[i]*z)%MOD;
}
}
for(ll i=kkk+1;i<=cz-1;i++)
{
ml[i]=ml[i]*z%MOD;
pl[i]=pl[i]*z%MOD;
sm[i]=sm[i]*z%MOD;
}
}
else if(p==2)
{
cin>>z;
z%=MOD;
for(ll i=x;i<=min(ed[kkk],y);i++)
c[i]=(c[i]+z)%MOD;
sm[kkk]=(sm[kkk]+z*(min(ed[kkk],y)-x+1))%MOD;
if(kkk!=cz)
{
for(ll i=bg[cz];i<=y;i++) c[i]=(c[i]+z)%MOD;
sm[cz]=(sm[cz]+z*(y-bg[cz]+1))%MOD;
}
for(ll i=kkk+1;i<=cz-1;i++)
{
pl[i]=(pl[i]+z)%MOD;
sm[i]+=(ed[i]-bg[i]+1)*z;
}
}
else
{
ll nm=0;
for(ll i=x;i<=min(ed[kkk],y);i++)
nm=(nm+c[i]*ml[kkk]+pl[kkk])%MOD;
if(kkk!=cz)
for(ll i=bg[cz];i<=y;i++)
nm=(nm+c[i]*ml[cz]+pl[cz])%MOD;
for(ll i=kkk+1;i<cz;i++)
nm=(nm+sm[i])%MOD;
cout<<nm<<endl;
}
//print();
}
return 0;
}