线段树求调!P1253
  • 板块灌水区
  • 楼主lgx57
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/23 20:51
  • 上次更新2024/5/24 00:07:04
查看原帖
线段树求调!P1253
1053695
lgx57楼主2024/5/23 20:51
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void fio(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}
int ls(int x){
	return x<<1;
}
int rs(int x){
	return x<<1|1;
}
int n,q;
const int N=1e5+5;
int a[N],tree[N<<2],tag1[N<<2],tag2[N<<2];
void push_up(int p){
	tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
void build(int p,int pl,int pr){
	if (pl==pr){
		tag2[p]=a[pl];
		tree[p]=a[pl];
		return ;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void addtag1(int p,int pl,int pr,int d){
	tag1[p]+=d;
	tree[p]+=d*(pr-pl+1);
}
void addtag2(int p,int pl,int pr,int d){
	tag2[p]=d;
	tree[p]=d*(pr-pl+1);
}
void push_down1(int p,int pl,int pr){
	if (tag1[p]){
		int mid=(pl+pr)>>1;
		addtag1(ls(p),pl,mid,tag1[p]);
		addtag1(rs(p),mid+1,pr,tag1[p]);
		tag1[p]=0;
	}
}
void push_down2(int p,int pl,int pr){
	int mid=(pl+pr)>>1;
	addtag2(ls(p),pl,mid,tag2[p]);
	addtag2(rs(p),mid+1,pr,tag2[p]);
	tag2[p]=0;
}
void update1(int l,int r,int p,int pl,int pr,int d){
	if (l<=pl&&pr<=r){
		addtag1(p,pl,pr,d);
		return ;
	}
	push_down1(p,pl,pr);
	int mid=(pl+pr)>>1;
	if (l<=mid){
		update1(l,r,ls(p),pl,mid,d);
	}
	if (r>mid){
		update1(l,r,rs(p),mid+1,pr,d);
	}
	push_up(p);
}
void update2(int l,int r,int p,int pl,int pr,int d){
	if (l<=pl&&pr<=r){
		addtag2(p,pl,pr,d);
		return ;
	}
	push_down2(p,pl,pr);
	int mid=(pl+pr)>>1;
	if (l<=mid){
		update2(l,r,ls(p),pl,mid,d);
	}
	if (r>mid){
		update2(l,r,rs(p),mid+1,pr,d);
	}
	push_up(p);
}
int query(int l,int r,int p,int pl,int pr){
	if (l<=pl&&pr<=r){
		return tree[p];
	}
	push_down2(p,pl,pr);
	push_down1(p,pl,pr);
	int ans=0;
	int mid=(pl+pr)>>1;
	if (l<=mid){
		ans=max(ans,query(l,r,ls(p),pl,mid));
	}
	if (r>mid){
		ans=max(ans,query(l,r,rs(p),mid+1,pr));
	}
	return ans;
}
signed main(){
	fio();
	cin>>n>>q;
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while (q--){
		int opt,x,y,k;
		cin>>opt;
		if (opt==1){
			cin>>x>>y>>k;
			update2(x,y,1,1,n,k);
		}
		else if(opt==2){
			cin>>x>>y>>k;
			update1(x,y,1,1,n,k);
		}
		else{
			cin>>x>>y;
			cout<<query(x,y,1,1,n)<<endl;
		}
	}
	return 0;
}
2024/5/23 20:51
加载中...