最后一个点TLE了许多次,开O2后显示WA
以下是代码,请大佬们提出意见,加以关注回报
#include<bits/stdc++.h>
using namespace std;
const int size=2e5+5;
long long n,m,a[size],sum[size],add[size],len;
int get(int x){ return x/len;}
void update(int l,int r,long long val)
{
if(get(l)==get(r))
for(int i=l;i<=r;i++)a[i]+=val,sum[get(i)]+=val;
else
{
int i=l,j=r;
while(get(i)==get(l))a[i]+=val,sum[get(i)]+=val,++i;
while(get(j)==get(r))a[j]+=val,sum[get(j)]+=val,--j;
for(int k=get(i);k<=get(j);k++)
sum[k]+=len*val,add[k]+=val;
}
}
long long query(int l,int r)
{
long long ans=0;
if(get(l)==get(r))
for(int i=l;i<=r;i++)ans+=a[i]+add[get(l)];
else
{
int i=l,j=r;
while(get(i)==get(l))ans+=a[i]+add[get(i)],++i;
while(get(j)==get(r))ans+=a[j]+add[get(j)],--j;
for(int k=get(i);k<=get(j);k++) ans+=sum[k];
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
len=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[get(i)]+=a[i];
}
int mode,x,y;long long k;
for(int i=1;i<=m;i++)
{
scanf("%d",&mode);
if(mode==1)
{
scanf("%d%d%lld",&x,&y,&k);
update(x,y,k);
}
if(mode==2||mode==3)scanf("%lld",&k);
if(mode==2)update(1,1,k);
if(mode==3)update(1,1,-k);
if(mode==4)
{
scanf("%d%d",&x,&y);
printf("%lld\n",query(x,y));
}
if(mode==5)printf("%lld\n",query(1,1));
}
return 0;
}