RT,对拍没查出来为啥(
只过了前三个点
不知道是因为对拍写错了还是什么其它的问题
#include<bits/stdc++.h>
using namespace std;
constexpr int si=1e5+10;
int n,q,t;
long long a[si],add[si],sum[si];
int belong[si];
int L[si],R[si];
inline void change(int l,int r,long long v){
int p=belong[l],q=belong[r];
if(p==q){
for(register int i=l;i<=r;++i){
a[i]+=v;
} sum[p]+=1ll*(r-l+1)*v;
}
else{
for(register int i=l;i<=R[p];++i){
a[i]+=v;
} sum[p]+=1ll*(R[p]-l+1)*v;
for(register int i=L[q];i<=r;++i){
a[i]+=v;
} sum[p]+=1ll*(r-L[q]+1)*v;
for(register int i=p+1;i<=q-1;++i){
add[i]+=v;
}
}
}
inline long long query(int l,int r){
int p=belong[l],q=belong[r];
long long res=0;
if(p==q){
for(register int i=l;i<=r;++i){
res+=a[i];
} res+=(r-l+1)*1ll*add[p];
}
else{
for(register int i=l;i<=R[p];++i){
res+=a[i];
} res+=(R[p]-l+1)*1ll*add[p];
for(register int i=L[q];i<=r;++i){
res+=a[i];
} res+=(r-L[q]+1)*1ll*add[q];
for(register int i=p+1;i<=q-1;++i){
res+=sum[i]+(R[i]-L[i]+1)*1ll*add[i];
}
} return res;
}
int main(){
scanf("%d%d",&n,&q);t=sqrt(n);
for(register int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
for(register int i=1;i<=t;++i){
L[i]=(i-1)*t-1,R[i]=i*t;
} if(R[t]<n) ++t,L[t]=R[t-1]+1,R[t]=n;
for(register int i=1;i<=t;++i){
for(register int j=L[i];j<=R[i];++j){
sum[i]+=a[j],belong[j]=i;
} add[i]=0;
}
for(register int i=1;i<=q;++i){
int op;
scanf("%d",&op);
if(op==1){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
change(l,r,k);
}
else{
int l,r;
scanf("%d%d",&l,&r);
printf("%lld\n",query(l,r));
}
} return 0;
}