萌新刚学分块,跑来切分块模板题,被#2,#9,#10摁在地上摩擦
除了这三个点,别的点都跑得飞快,这三个点T得飞起,求助大佬帮忙卡常
#include <bits/stdc++.h>
using namespace std;
const int N=100100,L=400,mod=571373;
typedef long long ll;
int n,m,op,in1,in2,in3,S,inp[N];
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-')f=-1;ch=getchar();}
while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
void write(ll x){
if(x<0){putchar('-');x=-x;}
ll k=x/10;if(k) write(k);
putchar(x-(k<<3)-(k<<1)+'0');
return ;
}
struct Bdn{int l,r;ll sum,t1,t2;};
struct Bd{
Bdn a[L];ll num[N],sum[N];
void build(){
for(int i=1,j=1;i<=n;i++){
if(!i%S){j++;a[j].l=i;}
if(i%S==S-1) a[j].r=i;
num[i]=j;sum[i]=inp[i];
a[j].sum+=sum[i];
a[j].t1=0;a[j].t2=1;
}
}
void add_t(int l,int r,int k,int p){
for(int i=l;i<=r;i++)
sum[i]=sum[i]+k;
a[p].sum=a[p].sum+k*(r-l+1)%mod;
return ;
}
void add(int l,int r,int k){
if(num[l]==num[r]){add_t(l,r,k,num[l]);return ;}
add_t(l,a[num[l]].r,k,num[l]);
add_t(a[num[r]].l,r,k,num[r]);
for(int i=num[l]+1;i<=num[r]-1;i++){
a[i].sum=a[i].sum+k*(a[i].r-a[i].l+1)%mod;
a[i].t1=a[i].t1+k;
}
return ;
}
void mul_t(int l,int r,int k,int p){
ll change=0;
for(int i=l;i<=r;i++){
change=change+sum[i]*(k-1)%mod;
sum[i]=sum[i]*k%mod;
}
a[p].sum=(a[p].sum+change)%mod;
}
void mul(int l,int r,int k){
if(num[l]==num[r]){mul_t(l,r,k,num[l]);return ;}
mul_t(l,a[num[l]].r,k,num[l]);
mul_t(a[num[r]].l,r,k,num[r]);
for(int i=num[l]+1;i<=num[r]-1;i++){
a[i].sum=(a[i].sum*k%mod);
a[i].t1=(a[i].t1*k%mod);
a[i].t2=(a[i].t2*k%mod);
}
return ;
}
ll ask_t(int l,int r,int p){
ll res=0;
for(int i=l;i<=r;i++)
res=(res+sum[i])%mod;
res=(res*a[p].t2)%mod;
res=(res+a[p].t1*(r-l+1))%mod;
return res;
}
ll ask(int l,int r){
if(num[l]==num[r]){return ask_t(l,r,num[l]);}
ll res=0;
res=(res+ask_t(l,a[num[l]].r,num[l]))%mod;
res=(res+ask_t(a[num[r]].l,r,num[r]))%mod;
for(int i=num[l]+1;i<=num[r]-1;i++)
res=(res+a[i].sum)%mod;
return res;
}
}bd;
int main(){
n=read();m=read();op=read();
S=sqrt(n);
for(int i=1;i<=n;i++)
inp[i]=read();
bd.build();
while(m--){
op=read();
if(op==1){in1=read();in2=read();in3=read();bd.mul(in1,in2,in3);}
if(op==2){in1=read();in2=read();in3=read();bd.add(in1,in2,in3);}
if(op==3){in1=read();in2=read();write(bd.ask(in1,in2));putchar('\n');}
}
return 0;
}