RE 0求调
查看原帖
RE 0求调
355507
Dreamlands楼主2022/7/29 17:09

如题,

#include<iostream>
using namespace std;
int a[100001],n,m;
struct line {
	int sum,l,r,tag;
} tree[1010];
inline int ls(int p) {
	return p<<1;
}
inline int rs(int p) {
	return p<<1|1;
}
void push_up(int p) {
	tree[p].sum=tree[ls(p)].sum+tree[rs(p)].sum;
	return ;
}
void build(int p,int l,int r) {
	if(l==r) {
		tree[l].sum=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
	return ;
}
void pass_tag(int p) {
	if(tree[p].tag!=0) {
		tree[ls(p)].tag+=tree[p].tag;
		tree[rs(p)].tag+=tree[p].tag;
		tree[ls(p)].sum+=tree[ls(p)].tag*(tree[ls(p)].r-tree[ls(p)].l+1);
		tree[rs(p)].sum+=tree[rs(p)].tag*(tree[rs(p)].r-tree[rs(p)].l+1);
		tree[p].tag=0;
	}
	return;
}
void add_tag(int p,int l,int r,int vary) {
	if(l<=tree[p].l&&r>=tree[p].r) {
		tree[p].tag+=vary;
		tree[p].sum+=tree[p].tag*(tree[p].r-tree[p].l+1);
		return ;
	}
	pass_tag(p);
	int mid=tree[p].l+tree[p].r>>1;
	if(l<=mid) {
		add_tag(ls(p),l,r,vary);

	}
	if(r>=mid) {
		add_tag(rs(p),l,r,vary);
	}
	push_up(p);
}
int check_block(int p,int l,int r) {
	if(l<=p&&p<=r) {
		return tree[p].sum;
	} else {
		pass_tag(p);
		int sum,mid=(tree[p].l+tree[p].r)>>1;
		if(l<=mid) {
			sum+=check_block(ls(p),l,r);
		}
		if(r>=mid) {
			sum+=check_block(rs(p),l,r);
		}
		return sum;
	}
}
int main() {
	int l,t,r,i,j,k,x1,y1;
	scanf("%d%d",&m,&n);
	for(i=1; i<=n; i++) {
		scanf("%d",&a[i]);
	}
	for(i=0; i<m; i++) {
		scanf("%d",&t);
		if(t==1){
			scanf("%d%d%d",&x1,&y1,&k);
			add_tag(1,x1,y1,k);
		}else{
			scanf("%d%d",&x1,&y1);
			printf("%d\n",check_block(1,x1,y1));
		}
	}
	return 0;
}
2022/7/29 17:09
加载中...