0pts求调
查看原帖
0pts求调
1417582
De___Bruyne楼主2024/11/1 10:32
//P2357 守墓人
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int N=2e5+10;

struct node{
	int l,r;
	ll sum;
	ll lazy=0;
}tr[N*4];
int a[N];
int n,m;
inline void pushup(int u){
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void build(int u,int l,int r){
	tr[u].l=l,tr[u].r=r;
	if(l==r)tr[u].sum=a[l];
	else{
		int mid=l+r>>1;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
	}
}

void pushdown(int u){
	if(tr[u].lazy){
		int a=tr[u].lazy;
		tr[u<<1].sum+=a*(tr[u<<1].r-tr[u<<1].l+1);
		tr[u<<1].lazy+=a;
		tr[u<<1|1].sum+=a*(tr[u<<1|1].r-tr[u<<1|1].l+1);
		tr[u<<1|1].lazy+=a;
		tr[u].lazy=0;
	}	
}
//单点修改 
void mdf(int u,int l,int k){
	if(tr[u].l==tr[u].r&&tr[u].l==l){
		tr[u].sum+=k;
		return;
	}
	pushdown(u);
	int mid=tr[u].l+tr[u].r>>1;
	if(l<=mid)mdf(u<<1,l,k);
	else mdf(u<<1|1,l,k);
	pushup(u);
}
//区间修改 
void modify(int u,int l,int r,int k){
	if(l==r){
		mdf(u,l,k);
		return;
	}
	if(tr[u].l>=l&&tr[u].r<=r){
		tr[u].sum+=k*(tr[u].r-tr[u].l+1);
		tr[u].lazy+=k;
		return;
	}
	pushdown(u);
	int mid=tr[u].l+tr[u].r>>1;
	if(l<=mid)modify(u<<1,l,r,k);
	if(r>mid)modify(u<<1|1,l,r,k);
	pushup(u);
}
ll query(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		return tr[u].sum;
	}
	pushdown(u);
	int mid=tr[u].l+tr[u].r>>1;
	if(r<=mid)return query(u<<1,l,r);
	if(l>mid)return query(u<<1|1,l,r);
	else return query(u<<1,l,r)+query(u<<1|1,l,r);
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	int t,l,r,k;
	build(1,1,n);
	while(m--){
		cin>>t;
		if(t==1){
			cin>>l>>r>>k;
			if(l>r)swap(l,r);
			modify(1,l,r,k);
			continue;
		}
		if(t==2){
			cin>>k;
			mdf(1,1,k);
			continue;
		}
		if(t==3){
			cin>>k;
			mdf(1,1,-k);
			continue;			
		}
		if(t==4){
			cin>>l>>r;
			if(l>r)swap(l,r);
			cout<<query(1,l,r)<<'\n';
			continue;
		}
		cout<<query(1,1,1)<<'\n';
	}
	return 0;
}

2024/11/1 10:32
加载中...