10分WA求助
查看原帖
10分WA求助
496117
wyh0721楼主2024/7/10 20:41
#include <bits/stdc++.h>
using namespace std;
int n,m,a[100005],mak;
struct node{
	int l,r,s,la;
}t[400005];
void lazy(int k,int v)
{
	t[k].s+=(t[k].r-t[k].l+1)*v;;
	t[k].la=v;
}
void pushdown(int k)
{
	lazy(k*2,t[k].la);
	lazy(k*2+1,t[k].la);
	t[k].la=-1;
}
void build(int k,int le,int ri)
{
	t[k].l=le;
	t[k].r=ri;
	t[k].la=-1;
	mak=max(k,mak);
	if(le==ri)
	{
		t[k].s=a[le];
		return; 
	}
	int mid=(le+ri)/2;
	build(k*2,le,mid);
	build(k*2+1,mid+1,ri);
	t[k].s=t[k*2].s+t[k*2+1].s;
}
void add(int k,int le,int ri,int v)
{
	if(t[k].l>=le && t[k].r<=ri)
		return lazy(k,v);
	if(t[k].la!=-1)
		pushdown(k);
	int mid=(t[k].l+t[k].r)/2;
	if(le<=mid)
		add(k*2,le,ri,v);
	if(ri>mid)
		add(k*2+1,le,ri,v);
	t[k].s=t[k*2].s+t[k*2+1].s;
}
int qu(int k,int le,int ri)
{
	int sum=0;
	if(t[k].l>=le && t[k].r<=ri)
		return t[k].s;
	if(t[k].la!=-1)
		pushdown(k);
	int mid=(t[k].l+t[k].r)/2;
	if(le<=mid)
			sum+=qu(k*2,le,ri);
	if(ri>mid)
		sum+=qu(k*2+1,le,ri);
		
	return sum;
}
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 x;
		cin>>x;
		if(x==1)
		{
			int w,y,z;
			cin>>w>>y>>z;
			add(1,w,y,z);
		}
		else
		{
			int y,z;
			cin>>y>>z;
			cout<<qu(1,y,z)<<endl;
			
		} 
	}
	return 0;
}

2024/7/10 20:41
加载中...