求助!过不了样例QAQ
  • 板块P2357 守墓人
  • 楼主LITFLYR
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/7/29 14:26
  • 上次更新2024/7/29 15:28:33
查看原帖
求助!过不了样例QAQ
909957
LITFLYR楼主2024/7/29 14:26
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int n,f,a[200005];
int op,l,r,k;
int tre[8000005],lazy[8000005];
void push_up(int f){
	tre[f]=tre[ls(f)]+tre[rs(f)];
}
void push_down(int f,int l,int r){
	lazy[ls(f)]+=lazy[f];
	lazy[rs(f)]+=lazy[f];
	int mid=(l+r)>>1;
	tre[ls(f)]+=(lazy[f]*(mid-l+1));
	tre[rs(f)]+=(lazy[f]*(r-mid));
	lazy[f]=0;
}
void build(int f,int l,int r){
	lazy[f]=0;
	if(l==r){
		tre[f]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls(f),l,mid);
	build(rs(f),mid+1,r);
	push_up(f);
}
void add(int f,int l,int r,int x,int y,int k){
	push_down(f,l,r);
	if(x<=l&&r<=y){
		tre[f]+=k*(r-l+1);
		lazy[f]+=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid) add(ls(x),l,mid,x,y,k);
	if(y>mid) add(rs(x),mid+1,r,x,y,k);
	push_up(f);  
}
int query(int f,int l,int r,int x,int y){
	push_down(f,l,r);
	if(x<=l&&r<=y){
		return tre[f];
	}
	int mid=(l+r)>>1;int ans=0;
	if(x<=mid) ans+=query(ls(f),l,mid,x,y);
	if(y>mid) ans+=query(rs(f),mid+1,r,x,y);
	return ans;
}
signed main(){
	cin >> n >> f;
	for(int i=1;i<=n;i++) cin >> a[i]; 
	build(1,1,n);
	while(f--){
		cin >> op;
		if(op==1){
			cin >> l >> r >> k;
			add(1,1,n,l,r,k);
		}
		else if(op==2){
			cin >> k; 
			add(1,1,n,1,1,k);
		}
		else if(op==3){
			cin >> k;
			add(1,1,n,1,1,-k);
		} 
		else if(op==4){
			cin >> l >> r;
			cout << query(1,1,n,l,r) << endl;
		}
		else{
			cout << query(1,1,n,1,1) << endl;
		}
	}
	return 0;
}
2024/7/29 14:26
加载中...