线段树50pts求条,玄关qwq
查看原帖
线段树50pts求条,玄关qwq
547760
Lain_yc楼主2024/11/26 09:25
#include<bits/stdc++.h>
using namespace std;
const long long N=1e6+5;
struct tree{
	long long l,r,data,addl,chl;
}t[N<<2];
long long n,m,a[N];
long long ls(long long p){
	return p<<1;
}
long long rs(long long p){
	return p<<1|1;
}
void pushup(long long p){
	t[p].data=max(t[ls(p)].data,t[rs(p)].data);
}
void pushdownc(long long p){
	if(t[p].chl!=-0x3f3f3f3f){
		t[ls(p)].addl=0;
		t[rs(p)].addl=0;
		t[ls(p)].data=t[rs(p)].data=t[p].chl;
		t[ls(p)].chl=t[rs(p)].chl=t[p].chl;
		t[p].chl=-0x3f3f3f3f;
	}
}
void pushdowna(long long p){
	if(t[p].addl){
		pushdownc(p);
		t[ls(p)].data+=t[p].addl;
		t[rs(p)].data+=t[p].addl;
		t[ls(p)].addl+=t[p].addl;
		t[rs(p)].addl+=t[p].addl;
		t[p].addl=0;
	}
}
void pushdown(long long p){
	pushdownc(p);
	pushdowna(p);
}
void build(long long p,long long l,long long r){
	t[p].l=l;t[p].r=r;
	t[p].chl=-0x3f3f3f3f;
	t[p].addl=0;
	if(t[p].l==t[p].r){
		t[p].data=a[l];
		return ;
	}
	long long mid=(t[p].l+t[p].r)/2;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
void add(long long p,long long l,long long r,long long k){
	if(t[p].l>=l&&t[p].r<=r){
		pushdownc(p);
		t[p].addl+=k;
		t[p].data+=k;
		return ;
	}
	pushdown(p);
	long long mid=(t[p].l+t[p].r)/2;
	if(l<=mid) add(ls(p),l,r,k);
	if(mid<r) add(rs(p),l,r,k);
	pushup(p);
}
void change(long long p,long long l,long long r,long long k){
	if(t[p].l>=l&&t[p].r<=r){
		t[p].chl=k;
		t[p].data=k;
		t[p].addl=0;
		return ;
	}
	pushdown(p);
	long long mid=(t[p].l+t[p].r)/2;
	if(l<=mid) change(ls(p),l,r,k);
	if(mid<r) change(rs(p),l,r,k);
	pushup(p);
}
long long query(long long p,long long l,long long r){
	if(t[p].l>=l&&t[p].r<=r){
		return t[p].data;
	}
	pushdown(p);
	long long ans=-0x7fffffff;
	long long mid=(t[p].l+t[p].r)/2;
	if(l<=mid) ans=max(ans,query(ls(p),l,r));
	if(mid<r) ans=max(ans,query(rs(p),l,r));
	return ans;
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		long long o,k,u,v;
		cin>>o>>u>>v;
		if(o==1){
			cin>>k;
			change(1,u,v,k);
		}
		else if(o==2){
			cin>>k;
			add(1,u,v,k);
		}
		else if(o==3){
			cout<<query(1,u,v)<<'\n';
		}
	}
}

#6#7#8#9WA,#10RE,使用AI调了但是并无【】用,故求助谷民

2024/11/26 09:25
加载中...