求助,最后一个样例输出是19
查看原帖
求助,最后一个样例输出是19
353846
liunaichang923楼主2023/5/13 23:26
#include<iostream>
using namespace std;
int n,m;
struct info
{
	int sum,l,r,tag;
} tre[200005];
int a[100005];
inline void pushup(int u)
{
	tre[u].sum=tre[u<<1].sum+tre[u<<1|1].sum;
}
void build(int u,int l,int r)
{
	tre[u].l=l;
	tre[u].r=r;
	if(l==r)
	{
		tre[u].sum=a[l];
		return;
	}
	int mid=(r+l)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
inline void maketag(int u,int len,int k)
{
	tre[u].tag+=k;
	tre[u].sum+=k*len;
}
inline void pushdown(int u,int l,int r)
{
	int mid=(l+r)>>1;
	maketag(u<<1,mid-l+1,tre[u].tag);
	maketag(u<<1|1,r-mid,tre[u].tag);
	tre[u].tag=0;
}
inline void update(int u,int l,int r,int k)
{
	if(tre[u].l>=l&&tre[u].r<=r)
	{
		maketag(u,r-l+1,k);
		return;
	}
	pushdown(u,l,r);
	int mid=(tre[u].l+tre[u].r)>>1;
	if(l<=mid) update(u<<1,l,mid,k);
	if(r>mid) update(u<<1|1,mid+1,r,k);
	pushup(u);
}
int query(int u,int l,int r)
{
	int res=0;
	if((tre[u].l>=l)&&(tre[u].r<=r)) return tre[u].sum;
	pushdown(u,l,r);
	int mid=(tre[u].l+tre[u].r)>>1;
	if(l<=mid) res+=query(u<<1,l,mid);
	if(r>mid) res+=query(u<<1|1,mid+1,r);
	return res;
}
int main()
{
	cin>>n>>m;	
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int opt,x,y,k;
		cin>>opt;
		if(opt==1)
		{
			cin>>x>>y>>k;
			update(1,x,y,k);
		}
		else
		{
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2023/5/13 23:26
加载中...