蒟蒻求助pwp
查看原帖
蒟蒻求助pwp
92187
光心楼主2021/7/13 19:32
#include<bits/stdc++.h>
#define L p<<1
#define R p<<1|1
#define int long long
using namespace std;
const int N=1000025;
int a[N];
struct st{ 
	int l;
	int r; 
	int p;
	int dis;
}t[N<<2];
inline void build(int l,int r,int p){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].p=a[l];
		return;
	}
	int mid = (l+r)>>1;
	build (l,mid,L);
	build (mid+1,r,R);
	t[p].p = t[L].p+t[R].p;
}

inline void push_down(int p){
	if(t[p].dis!=0){
		t[L].p+=t[p].dis*(t[L].r-t[L].l+1);
		t[L].dis+=t[p].dis;
		t[R].p+=t[p].dis*(t[R].r-t[R].l+1);
		t[R].dis+=t[p].dis;
	}	
}

inline void update(int l,int r,int p,int k){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].p+=k*(t[p].r-t[p].l+1);
		t[p].dis+=k;
		return;
	}
	push_down(p);
	int mid = (t[p].l+t[p].r)>>1;
	if(l<=mid)	update(l,mid,L,k);
	if(r>mid)	update(mid+1,r,R,k);
	t[p].p=t[L].p+t[R].p;
}

inline int query(int l,int r,int p){
	if(l<=t[p].l&&t[p].r<=r)
	return t[p].p;
	push_down(p);
	int mid = (t[p].l+t[p].r)>>1;
	int ans = 0;
	if(l<=mid)	ans+=query(l,r,L);
	if(r>mid)	ans+=query(l,r,R);
	return ans;
}
signed main()
{
	int n,m;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	scanf("%lld",&a[i]); 
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		int Q,l,r,k;
		scanf("%lld",&Q);
		if(Q==1){
			scanf("%lld%lld%lld",&l,&r,&k);
			update(l,r,1,k);
		}
		else{
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",query(l,r,1));
		}
	}
	return 0;
}

代码如上,能过样例但是一交就全WA qwq

2021/7/13 19:32
加载中...