求助
查看原帖
求助
490314
小铭同学lym楼主2021/10/12 20:53

本JR调不出来,求助各位大佬。

#include<bits/stdc++.h>
#define rg register int 
using namespace std;
const int MAXN=100000;
int tree[4*MAXN+3],n,m,a[MAXN],tag[4*MAXN+5];
void build(int l,int r,int now)
{
	if(l==r)
	{
		tree[now]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,now*2);
	build(mid+1,r,now*2+1);
	tree[now]=tree[now*2]+tree[now*2+1];
}
void pushdown(int now)
{
	if(tag[now])
	{
		tag[now*2]+=tag[now];
		tag[now*2+1]+=tag[now];
		tree[now*2]+=tag[now];
		tree[now*2+1]+=tag[now];
		tag[now]=0; 
	}
}
void change(int ql,int qr,int l,int r,int k,int now)
{
	if(ql<=l&&r<=qr)
	{
		tree[now]+=(r-l+1)*k;
		tag[now]+=k;
		return ;
	}
	pushdown(now);
	int mid=(l+r)/2;
	if(ql<=mid)	change(ql,qr,l,mid,k,now*2);
	if(mid<qr)	change(ql,qr,mid+1,r,k,now*2+1);
	tree[now]=tree[now*2]+tree[now*2+1];
}
int qry(int ql,int qr,int l,int r,int now)
{
	if(ql<=l&&r<=qr)
		return tree[now];
	pushdown(now);
	int mid=(l+r)/2,XCNT=0;
	if(ql<=mid) XCNT+=qry(ql,qr,l,mid,now*2);
	if(mid<r)	XCNT+=qry(ql,qr,mid+1,r,now*2+1);
	return XCNT; 
}
int main()
{
	int pd,nl,nr,k;
	scanf("%d%d",&n,&m);
	for(rg i=1;i<=n;++i)	scanf("%d",&a[i]);
	build(1,n,1);
	for(rg i=1;i<=m;++i)
	{
		scanf("%d",&pd);
		if(pd==1)
		{
			scanf("%d%d%d",&nl,&nr,&k);
			change(nl,nr,1,n,k,1);	
		}
		else
		{
			scanf("%d%d",&nl,&nr);
			printf("%d",qry(nl,nr,1,n,1));
		}
	}
}
2021/10/12 20:53
加载中...