请求查错
查看原帖
请求查错
68960
M_and_P_楼主2021/7/12 07:56
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int N=100005;
int ql,qr,d,sum;
int n,m;
struct Tree{
	int addv[4*N],sumv[4*N];
	void maintain(int o,int L,int R)
	{
		int lc=o*2,rc=o*2+1;
		if (L<R)sumv[o]=sumv[lc]+sumv[rc];
		sumv[o]+=addv[o]*(R-L+1);
	}
	void pushdown(int o)
	{
		int lc=o*2,rc=o*2+1;
		if (addv[o])
		{
			addv[lc]+=addv[o];
			addv[rc]+=addv[o];
			addv[o]=0;
		}
	}
	void update(int o,int L,int R)
	{
		int lc=o*2,rc=o*2+1;
		if (ql<=L&&R<=qr)addv[o]+=d;
		else
		{
			pushdown(o);
			int M=L+(R-L)/2;
			if (ql<=M)update(lc,L,M);else maintain(lc,L,M);
			if (M<qr)update(rc,M+1,R);else maintain(rc,M+1,R);
		}
		maintain(o,L,R);
	}
	void query(int o,int L,int R,int add)
	{
		int lc=o*2,rc=o*2+1;
		if (ql<=L&&R<=qr)
		{
			sum+=sumv[o]+add*(R-L+1);
			printf("%d %d %d %d\n",sum,sumv[o],add,addv[o]);
		}
		else
		{
			int M=L+(R-L)/2;
			if (ql<=M)query(lc,L,M,add+addv[o]);
			if (M<qr)query(rc,M+1,R,add+addv[o]);
		}
	}
} tree;
int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{
		int w;
		scanf("%d",&w);
		ql=qr=i;d=w;
		tree.update(1,1,n);
	}
	for (int i=1;i<=m;i++)
	{
		int op;int x,y;
		scanf("%d%d%d",&op,&ql,&qr);
		if (op==1)
		{
			scanf("%d",&d);
			tree.update(1,1,n);
		}
		if (op==2)
		{
			sum=0;
			tree.query(1,1,n,0);
			printf("%d\n",sum);
		}
	}
	return 0;
}

请求dalao查错,万分感谢啊

2021/7/12 07:56
加载中...