求查错
查看原帖
求查错
180406
FormulaOne楼主2022/6/17 17:58

样例过不了,看不出哪里有问题,求助

#include <iostream>
#include <cstdio>
using namespace std;
int n,m,a[100001],w[1000001],lazy[1000001];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void build(int u,int L,int R)
{
	if(L==R)
	{
		w[u]=a[L];
		return;
	}
	int M=(L+R)/2;
	build(u*2,L,M);
	build(u*2+1,M+1,R);
	w[u]=w[u*2]+w[u*2+1];
}
int query(int u,int L,int R,int l,int r)
{
	if(l<=L&&R<=r) return w[u];
	if(L>r||R<l) return 0;
	int M=(L+R)/2;
	return query(u*2,L,M,l,r)+query(u*2+1,M+1,R,l,r);
}
void maketag(int u,int len,int x)
{
	lazy[u]+=x;
	w[u]+=len*x;
}
void pushdown(int u,int L,int R)
{
	int M=(L+R)/2;
	maketag(u*2,M-L+1,lazy[u]);
	maketag(u*2+1,R-M,lazy[u]);
	lazy[u]=0;
}
void update(int u,int L,int R,int l,int r,int x)
{
	if(l<=L&&R<=r) maketag(u,R-L+1,x);
	else if(!(L>r||R<l))
	{
		int M=(L+R)/2;
		pushdown(u,L,R);
		update(u*2,L,M,l,r,x);
		update(u*2+1,M+1,R,l,r,x);
		w[u]=w[u*2]+w[u*2+1];
	}
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int k,x,y;
		k=read();
		if(k==1)
		{
			x=read(),y=read(),k=read();
			update(1,1,n,x,y,k);
		}
		if(k==2)
		{
			x=read(),y=read();
			printf("%d\n",query(1,1,n,x,y));
		}
	}
	return 0;
}
2022/6/17 17:58
加载中...