RE三个点求救
查看原帖
RE三个点求救
118630
Lube楼主2021/2/15 14:00
#include<bits/stdc++.h>
using namespace std;
long long a[100005];
int n,m;
struct s{
	long long data,lazy;
	int lc,rc;
}tree[400005];
void pushdown(int mark)
{
	if(tree[mark].lazy)
	{
		int l,r;
		l=mark<<1;r=(mark<<1|1);
		tree[l].lazy+=tree[mark].lazy;
		tree[r].lazy+=tree[mark].lazy;
		tree[l].data+=((long long)(tree[l].rc-tree[l].lc+1))*(tree[mark].lazy);
		tree[r].data+=((long long)(tree[r].rc-tree[r].lc+1))*(tree[mark].lazy);
		tree[mark].lazy=0;
	}
}
void build(int mark,int l,int r)
{
	tree[mark].lc=l;tree[mark].rc=r;
	if(l==r){tree[mark].data=a[l];return;}
	int mid;mid=(l+r)>>1;
	build(mark<<1,l,mid);build(mark<<1|1,mid+1,r);
	tree[mark].data=tree[mark<<1].data+tree[mark<<1|1].data;
//	printf("%d %lld\n",mark,tree[mark].data);
}
void add(int mark,int x,int y,long long z)
{
	int l,r;l=tree[mark].lc;r=tree[mark].rc;
	pushdown(mark);
	if(l>=x&&r<=y)
	{
		long long num;num=(r-l+1)*z;
		tree[mark].data+=num;
		tree[mark].lazy+=z;return;
	}
	int mid;mid=(l+r)>>1;
	if(mid>=x)add(mark<<1,x,y,z);
	if(mid+1<=y)add(mark<<1|1,x,y,z);
	tree[mark].data=tree[mark<<1].data+tree[mark<<1|1].data;
}
long long find(int mark,int x,int y)
{
	int l,r;l=tree[mark].lc;r=tree[mark].rc;
	pushdown(mark);
	if(l>=x&&r<=y)
	{
//	    printf("  %d %d %lld\n",tree[mark].lc,tree[mark].rc,tree[mark].data);
	    return tree[mark].data;
	}
	int mid;mid=(l+r)>>1;
	long long ans=0;
	if(mid>=x)ans+=find(mark<<1,x,y);
	if(mid+1<=y)ans+=find(mark<<1|1,x,y);
//	printf("  %d %d %lld\n",tree[mark].lc,tree[mark].rc,ans);
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=n;i++)scanf("%lld",&a[i]);
	build(1,1,n);
//	for(int i=1;i<=n;i++)printf("%lld\n",find(1,i,i));
	for(register int i=1;i<=m;i++)
	{
		int op,x,y;long long z;scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d%lld",&x,&y,&z);
			add(1,x,y,z);
		}
		if(op==2)
		{
			scanf("%d%d",&x,&y);
			printf("%lld\n",find(1,x,y));
		}
//		for(register int j=1;j<=n;j++)printf("%d ",find(1,j,j));printf("\n");
	}
}
2021/2/15 14:00
加载中...