60分求條
  • 板块P2357 守墓人
  • 楼主Im_Joker
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/11/23 18:26
  • 上次更新2024/11/23 20:52:38
查看原帖
60分求條
1192776
Im_Joker楼主2024/11/23 18:26
#include<bits/stdc++.h>
#define int long long
#define N 2*100000+10
using namespace std;
int c[N<<2];
int b[N];
int a[N];
int n,q;
void build(int l,int r,int p){
	if(l==r){
		c[p]=a[l];
		return;
	}
	int m=(l+r)/2;
	build(l,m,p*2);
	build(m+1,r,p*2+1);
	c[p]=c[p*2]+c[p*2+1];
}   
int getsum(int l,int r,int s,int t,int p){
//	cout<<s<<" "<<t<<endl;
	if(l<=s&&t<=r){
		return c[p];
	}
	int m=(s+t)/2;
	if(b[p]){
		c[p*2]+=(m-s+1)*b[p];
		c[p*2+1]+=(t-m)*b[p];
//		c[p]+=(t-s+1)*b[p];
		b[p*2]+=b[p];
		b[p*2+1]+=b[p];
		b[p]=0;
		c[p]=c[p*2]+c[p*2+1];
	}
	int sumn=0;
	if(l<=m) sumn+=getsum(l,r,s,m,p*2);
	if(r>m) sumn+=getsum(l,r,m+1,t,p*2+1);
	return sumn;
}
void update(int l,int r,int s,int t,int k,int p){
	if(l<=s&&t<=r){
		b[p]+=k;
		c[p]+=k*(t-s+1);
		return;
	}
	int m=(s+t)/2;
	if(b[p]){
		c[p*2]+=(m-s+1)*b[p];
		c[p*2+1]+=(t-m)*b[p];
//		c[p]+=(t-s+1)*b[p];
		b[p*2]+=b[p];
		b[p*2+1]+=b[p];
		b[p]=0;
	}
	if(l<=m) update(l,r,s,m,k,p*2);
	if(r>m) update(l,r,m+1,t,k,p*2+1);
	c[p]=c[p*2]+c[p*2+1];	
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	for(int i=1;i<=q;i++){
		int op,x,y,k;
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			update(x,y,1,n,k,1);
		}else if(op==2){
			cin>>k;
			update(1,1,1,n,k,1);
		}else if(op==3){
			cin>>k;
			update(1,1,1,n,-k,1);			
		}else if(op==4){
			cin>>x>>y;
			cout<<getsum(x,y,1,n,1)<<endl;
		}else{
			cout<<getsum(1,1,1,n,1)<<endl;
		}
	}
	return 0; 
}
2024/11/23 18:26
加载中...