求调,或给个hack(玄关)
查看原帖
求调,或给个hack(玄关)
726368
kk_is_ethereal楼主2023/10/9 14:02
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline void read(int &x) {
	x=0;
	short flag=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')flag = -1;
		c=getchar();
	}
	while(c >= '0' && c <= '9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	x*=flag;
}
const int nul=1e18;
int n,a[200010],m;
struct tree{
	int v,l,r,lazy,lazyx;
}t[10000000];
void build(int x,int l,int r){
	t[x].l=l,t[x].r=r;
	t[x].lazy=t[x].lazyx=nul;
	if(l==r){
		t[x].v=a[l];
		return;
	}
	build(x<<1,l,(l+r)>>1);
	build(x<<1|1,((l+r)>>1)+1,r);
	t[x].v=max(t[x<<1].v,t[x<<1|1].v);
}
void push_down(int x){
	t[x<<1].lazy+=t[x].lazy;
	t[x<<1].lazy%=nul;
	t[x<<1|1].lazy+=t[x].lazy;
	t[x<<1|1].lazy%=nul;
	t[x<<1].v+=t[x].lazy;
	t[x<<1|1].v+=t[x].lazy;
	t[x].lazy=nul;
}
void push_downx(int x){
	t[x<<1].lazyx=t[x].lazyx;
	t[x<<1|1].lazyx=t[x].lazyx;
	t[x<<1].v=t[x].lazyx;
	t[x<<1|1].v=t[x].lazyx;
	t[x].lazyx=nul;
}
void update(int x){
	if(t[x].lazyx!=nul)push_downx(x);
	if(t[x].lazy!=nul)push_down(x);
}
void xiu(int x,int l,int r,int v){
	if(l<=t[x].l&&t[x].r<=r){
		t[x].v=v;
		t[x].lazy=nul;
		t[x].lazyx=v;
		return;
	}
	update(x);
	if(l<=t[x<<1].r)xiu(x<<1,l,r,v);
	if(r>=t[x<<1|1].l)xiu(x<<1|1,l,r,v);
	t[x].v=max(t[x<<1].v,t[x<<1|1].v);
} 
void add(int x,int l,int r,int v){
	if(l<=t[x].l&&t[x].r<=r){
		t[x].v+=v;
		if(t[x].lazyx!=nul)t[x].lazyx+=v;
		else t[x].lazy=(t[x].lazy+v)%nul;
		return;
	}
	update(x);
	if(l<=t[x<<1].r)add(x<<1,l,r,v);
	if(r>=t[x<<1|1].l)add(x<<1|1,l,r,v);
	t[x].v=max(t[x<<1].v,t[x<<1|1].v);
}
int search(int x,int l,int r){
	if(l<=t[x].l&&t[x].r<=r)return t[x].v;
	update(x);
	int s=-nul;
	if(l<=t[x<<1].r)s=max(s,search(x<<1,l,r));
	if(r>=t[x<<1|1].l)s=max(s,search(x<<1|1,l,r));
	return s;
}
signed main(){
	read(n),read(m);
	for(int i=1;i<=n;i++)read(a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int opt,l,r;
		read(opt),read(l),read(r);
		if(opt==1){
			int x;
			read(x);
			xiu(1,l,r,x);
		}
		if(opt==2){
			int x;
			read(x);
			add(1,l,r,x);
		}
		if(opt==3){
			printf("%lld\n",search(1,l,r));
		}
	}
	return 0;
}


2023/10/9 14:02
加载中...