70分求助
查看原帖
70分求助
967367
dingjingyi楼主2023/7/1 16:06
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int M = 2e5 + 5;
LL n,m,a[M],w[M<<2],tag[M<<2];
void push_up(int u){
  w[u]=w[u<<1]+w[u<<1|1];
}
void biuld(int u,int l,int r) {
  	if(l==r){
		w[u]=a[l];
		return;
  	}
  	int mid=l+r>>1;
  	biuld(u<<1,l,mid);
  	biuld(u<<1|1,mid+1,r);
  	push_up(u);
}
void add_tag(int u,int l,int r,LL x) {
  	w[u]+=(r-l+1)*x,tag[u]+=x;
}
void push_down(int u,int l,int r) {
  	if(tag[u]){
    	int mid=l+r>>1;
    	add_tag(u<<1,l,mid,tag[u]);
    	add_tag(u<<1|1,mid+1,r,tag[u]);
    	tag[u]=0;
  	}
}
LL query(int u,int l,int r,int L,int R) {
  	if(L<=l&&r<=R) return w[u];
  	else if(l>R||r<L) return 0;
  	else{
    	int mid=l+r>>1;
    	push_down(u,l,r);
    	return query(u<<1,l,mid,L,R)+query(u<<1|1,mid+1,r,L,R);
  	}
}
void update(int u,int l,int r,int L,int R,LL x) {
  	if (L<=l&&r<=R) add_tag(u,l,r,x);
  	else if (l>R||r<L) return;
  	else{
    	int mid=l+r>>1;
    	push_down(u,l,r);
    	update(u<<1,l,mid,L,R,x);
    	update(u<<1|1,mid+1,r,L,R,x);
    	push_up(u);
  	}
}
int main(){
  	cin>>n>>m;
  	for(int i=1;i<=n;i++) cin>>a[i];
  	biuld(1,1,n);
  	int x,y,k,op;
  	while(m){
  		m--;
    	cin>>op>>x>>y;
    	if (op==1) {
      		cin>>k;
      		update(1,1,n,x,y,k);
    	}else cout<<query(1,1,n,x,y)<<"\n";
  	}
  	return 0;
}
2023/7/1 16:06
加载中...