求助(玄关)
查看原帖
求助(玄关)
1199534
ycy1124楼主2024/6/24 10:25
#include<bits/stdc++.h>
using namespace std;
struct Node{
	long long l,r,bj,w;
}a[2000001];
long long b[500001];
void work(int p,int l,int r){
	int mid=(l+r)>>1;
	a[p].l=l;
	a[p].r=r;
	if(l==r){
		a[p].w=b[l];
		return;
	}
	work(p*2,l,mid);
	work(p*2+1,mid+1,r);
	a[p].w=a[p*2].w+a[p*2+1].w;
}
int ans(int p,int l,int r,int x,int y){
	int mid=(l+r)>>1;
	a[p].w+=(r-l+1)*a[p].bj;
	a[p*2].bj=a[p].bj;
	a[p*2+1].bj=a[p].bj;
	a[p].bj=0;
	if(l>=x&&r<=y){
		return a[p].w;
	}
	if(y<=mid){
		return ans(p*2,l,mid,x,y);
	}
	else if(x>mid){
		return ans(p*2+1,mid+1,r,x,y);
	}
	else{
		return ans(p*2,l,mid,x,y)+ans(p*2+1,mid+1,r,x,y);
	}
} 
void work1(int p,int l,int r,int x,int y,int k){
	int mid=(l+r)>>1;
	if(x<=l&&y>=r){
		a[p].bj+=k;
		return;
	}
	a[p].w+=(min(y,r)-max(x,l)+1)*k;
	if(x>mid){
		work1(p*2+1,mid+1,r,x,y,k);
	}
	else if(y<=mid){
		work1(p*2,l,mid,x,y,k);
	}
	else{
		work1(p*2,l,mid,x,y,k);
		work1(p*2+1,mid+1,r,x,y,k);
	}
}
void read(long long &x){
	x=0;
	int f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	x*=f;
}
int main(){
	long long n,m;
	read(n);
	read(m);
	for(int i=1;i<=n;i++){
		read(b[i]);
	}
	work(1,1,n);
	for(int i=1;i<=m;i++){
		long long ch,x,y,k;
		read(ch);
		if(ch==1){
			read(x);
			read(y);
			read(k);
			work1(1,1,n,x,y,k);
		}
		else{
			read(x);
			read(y);
			printf("%lld\n",ans(1,1,n,x,y));
		}
	}
	return 0;
}
2024/6/24 10:25
加载中...