模板题求更正!20分WA
查看原帖
模板题求更正!20分WA
376274
OnlyJerry楼主2021/7/19 10:36
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,a[100005],c,op1,op2,op3,s[100005],del[100005];
struct node
{
    ll l,r;
}tr[1000100];
void pushup(ll u)
{
 	s[u]=s[u<<1]+s[u<<1|1];
}
void pushdown(ll u,ll l,ll r)
{
	ll mid=l+r>>1;
	s[u<<1]=s[u<<1]+(mid-l+1)*del[u];
	s[u<<1|1]=s[u<<1|1]+(r-mid)*del[u];
	del[u<<1]+=del[u];
	del[u<<1|1]+=del[u];
	del[u]=0;
}
void build(ll u,ll l,ll r)
{
	tr[u].l=l;
	tr[u].r=r;
	if(l==r)
	{
		s[u]=a[l];
		return;
	}
	ll mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify(ll u,ll x,ll y,ll v)
{
	ll l=tr[u].l,r=tr[u].r;
	if(x<=l && r<=y)
	{
		s[u]=s[u]+(r-l+1)*v;
		del[u]+=v;
		return;
	}
	ll mid=l+r>>1;
	pushdown(u,l,r);
	if(x<=mid) modify(u<<1,x,y,v);
	if(y>mid) modify(u<<1|1,x,y,v);
	pushup(u);
}
ll getsum(ll u,ll x,ll y)
{
	ll l=tr[u].l,r=tr[u].r;
    if(x<=l && r<=y) return s[u];
    ll mid=l+r>>1,sum=0;
	pushdown(u,x,y);
    if(x<=mid) sum+=getsum(u<<1,x,y);
    if(y>mid) sum+=getsum(u<<1|1,x,y);
    return sum;
}
int main()
{
    cin>>n>>m;
    for(ll i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    for(ll i=1;i<=m;i++)
    {
        cin>>c;
        if(c==1)
        {
            scanf("%lld%lld%lld",&op1,&op2,&op3);
            modify(1,op1,op2,op3);
        }
        else
        {
            scanf("%lld%lld",&op1,&op2);
            printf("%lld\n",getsum(1,op1,op2));
        }
    }
    return 0;
}

改了一天都没改对qwq

求大佬指出错误

本人蒟蒻,不要骂哭我qwq

2021/7/19 10:36
加载中...