有部分答案正确
查看原帖
有部分答案正确
609160
SDftx楼主2022/4/27 00:18
#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
struct tree
{
	int l,r;
	long long tag,val;
	int lch,rch;
}rt[MAXN*4];
int cnt;
long long a[MAXN];
long long sum(int x)
{
	return rt[x].val+rt[x].tag*(rt[x].r-rt[x].l+1);
}
int build(int l,int r)
{
	cnt++;
	int x=cnt;		
	rt[x].l=l;
	rt[x].r=r;
	if(l==r)
	{
		rt[x].val=a[l];
		return x;
	}
	int mid=(l+r)/2;
	rt[x].lch=build(l,mid);
	rt[x].rch=build(mid+1,r);
	rt[x].val=rt[rt[x].lch].val+rt[rt[x].rch].val;
	return x;
}
void spread(int x)
{
	if(rt[x].tag)
	{
	  //  rt[x].val+=rt[x].tag*(rt[x].r-rt[x].l+1);
		rt[rt[x].lch].tag+=rt[x].tag;
		rt[rt[x].rch].tag+=rt[x].tag;
		rt[x].tag=0;
	}
}
void change(int x,int l,int r,int v)
{
	if(l<=rt[x].l&&r>=rt[x].r)
	{
	//	rt[x].val+=v*(rt[x].r-rt[x].l+1);
		rt[x].tag+=v;
		return ;
	}
	spread(x);
	int mid=(rt[x].l+rt[x].r)/2;
	if(l<=mid) change(rt[x].lch,l,r,v);
	if(r>mid) change(rt[x].rch,l,r,v);
	rt[x].val=sum(rt[x].lch)+sum(rt[x].rch);
	//rt[rt[x].lch].val+rt[rt[x].rch].val;
}
long long ask(int x,int l,int r)
{
	if(l<=rt[x].l&&r>=rt[x].r)	return sum(x);
	spread(x);
	int mid=(rt[x].l+rt[x].r)/2;
	long long tmp=0;
	if(l<=mid) tmp+=ask(rt[x].lch,l,r);
	if(r>mid) tmp+=ask(rt[x].rch,l,r);
	return tmp;
}
int n,m;

int main()
{
//	freopen("P3372_1.in","r",stdin);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n);
	for(int i=1;i<=m;i++)
	{
		int opt,x,y,k;
		cin>>opt;
		if(opt==1)
		{
			cin>>x>>y>>k;
			change(1,x,y,k);
		}
		if(opt==2)
		{
			cin>>x>>y;
			cout<<ask(1,x,y)<<endl;
		}
	}
	return 0;
}
2022/4/27 00:18
加载中...