90求条
查看原帖
90求条
1288786
meiweid_quanyiang楼主2025/7/31 16:46

rt

#include<bits/stdc++.h>
using namespace std;
struct tre{
	int l,r,add;
	long long x;
}tree[2000006];
int a[500004];
void build(int x,int l,int r){
	tree[x].l=l;tree[x].r=r;
	if(l==r){
		tree[x].x=a[l];
		return;
	}
	int mid((tree[x].l+tree[x].r)/2);
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	tree[x].x=tree[x*2].x+tree[x*2+1].x;
}
void p_d(int x){
	if(tree[x].add){
		tree[x*2].add+=tree[x].add;
		tree[x*2+1].add+=tree[x].add;
		tree[x*2].x+=(tree[x].add*(tree[x*2].r-tree[x*2].l+1));
		tree[x*2+1].x+=(tree[x].add*(tree[x*2+1].r-tree[x*2+1].l+1));
		tree[x].add=0;
	}
}
void update(int x,int k,int l,int r){
	if(tree[x].l>=l&&tree[x].r<=r){
		tree[x].x+=k*(tree[x].r-tree[x].l+1);
		tree[x].add+=k;
		return;
	}
	else{
		p_d(x);
		int mid=(tree[x].r+tree[x].l)>>1;
		if(l<=mid)update(x*2,k,l,r);
		if(r>mid)update(x*2+1,k,l,r);
		tree[x].x=tree[x*2].x+tree[x*2+1].x;
	}
	
}
long long query(int x,int l,int r){
	if(l<=tree[x].l&&r>=tree[x].r) return tree[x].x;
	p_d(x);
	int mid=((tree[x].r+tree[x].l)>>1);
	long long sum=0;
	if(l<=mid)sum+=query(x*2,l,r);
	if(r>mid)sum+=query(x*2+1,l,r);
	return sum;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
//		cout<<a[i]<<' ';
	}
	build(1,1,n);//cout<<1111;
	for(int i=1;i<=m;i++){
		long long b,c,d;
		char ch;
		cin>>ch;
		if(ch=='1')
			scanf("%lld%lld%lld",&b,&c,&d);
		else scanf("%lld%lld",&b,&c);
		if(ch=='1'){
			update(1,d,b,c);
		}
		else{
			printf("%lld\n",query(1,b,c));
		}
	}
}
2025/7/31 16:46
加载中...