10分求调
查看原帖
10分求调
215817
gyc071116楼主2024/8/1 21:50

除了#1全WA,样例能过

#include<bits/stdc++.h>
#define ls (x<<1)
#define rs ((x<<1)|1)
#define int long long
using namespace std;
struct node{
	int l;
	int r;
	int sum;
}tree[400005];
int a[100005],tag[400005];
void build_tree(int x,int l,int r){
	if(l==r){
		tree[x]=(node){l,l,a[l]};
		return;	
	}
	int mid=(l+r)>>1;
	build_tree(ls,l,mid);
	build_tree(rs,mid+1,r);
	tree[x]=(node){l,r,tree[ls].sum+tree[rs].sum};
	return;
}
void down(int x){
	if(tag[x]){
		tree[ls].sum=tree[ls].sum+(tree[ls].r-tree[ls].l+1)*tag[x];
		tree[rs].sum=tree[rs].sum+(tree[rs].r-tree[rs].l+1)*tag[x];
		tag[ls]+=tag[x];
		tag[rs]+=tag[x];
		tag[x]=0;
	}
}
void update(int x){
	tree[x].sum=tree[rs].sum+tree[ls].sum;
}
int search(int x,int l,int r){
	if(tree[x].l>=l&&tree[x].r<=r){
		return tree[x].sum;
	}
	if(tree[x].l>r||tree[x].r<l) return 0;
	down(x);
	return search(ls,l,r)+search(rs,l,r);
}
void add(int x,int l,int r,int k){
	if(tree[x].l>=l&&tree[x].r<=r){
		tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
		tag[x]+=k;
		return;
	}
	if(tree[x].l>r||tree[x].r<l) return;
	add(ls,l,r,k);
	add(rs,l,r,k);
	update(x);
}
signed main(){
	int n,m;
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build_tree(1,1,n);
	for(int i=1;i<=m;i++){
		int op;
		scanf("%lld",&op);
		if(op==1){
			int xx,yy,k;
			scanf("%lld %lld %lld",&xx,&yy,&k);
			add(1,xx,yy,k);
		}
		if(op==2){
			int xxx,yyy;
			scanf("%lld %lld",&xxx,&yyy);
			printf("%lld\n",search(1,xxx,yyy));
		}
	}
	return 0;
}
2024/8/1 21:50
加载中...