零分求助,第二个样例过了!!!!!!!!!!!!!!!
查看原帖
零分求助,第二个样例过了!!!!!!!!!!!!!!!
470782
Anonymous__user楼主2022/7/13 11:20
#include<bits/stdc++.h>
using namespace std;
long long nn,mm,op,l,r,x,a[1000010],da;
struct shu{
	long long ll,rr,Max,bj,bj2;
}tt[4000010];
void jian(long long i,long long zuo,long long you){
	tt[i].ll=zuo;
	tt[i].rr=you;
	tt[i].bj=12349999496383248888;
	if(l==r){
		tt[i].Max=a[l];
		return;
	}
	jian(i*2,zuo,(zuo+you)/2);
	jian(i*2+1,(zuo+you)/2+1,you);
	tt[i].Max=max(tt[i*2].Max,tt[i*2+1].Max);
}
void xia(long long i){
	if(tt[i].bj==12349999496383248888 && tt[i].bj2==0)
		return;
	if(tt[i].bj!=12349999496383248888){
		tt[i*2].bj=tt[i].bj;
		tt[i*2+1].bj=tt[i].bj;
		tt[i*2].bj2=tt[i].bj2;
		tt[i*2+1].bj2=tt[i].bj2;
		tt[i*2].Max=tt[i].bj+tt[i].bj2;
		tt[i*2+1].Max=tt[i].bj+tt[i].bj2;
		tt[i].bj=12349999496383248888;
		tt[i].bj2=0;
	}	
	else{
		tt[i*2].bj2+=tt[i].bj2;
		tt[i*2+1].bj2+=tt[i].bj2;
		tt[i*2].Max+=tt[i].bj2;
		tt[i*2+1].Max+=tt[i].bj2;
		tt[i].bj2=0;
	}
}
void st1(long long i){
	if(l<=tt[i].rr && r>=tt[i].ll){
		if(l<=tt[i].ll && r>=tt[i].rr){
			tt[i].bj=x;
			tt[i].bj2=0;
			tt[i].Max=x;
			return;
		}
		xia(i);
		st1(i*2);
		st1(i*2+1);
		tt[i].Max=max(tt[i*2].Max,tt[i*2+1].Max);
	}
}
void st2(long long i){
	if(l<=tt[i].rr && r>=tt[i].ll){
		if(l<=tt[i].ll && r>=tt[i].rr){
			tt[i].bj2+=x;
			tt[i].Max+=x;
			return;
		}
		xia(i);
		st2(i*2);
		st2(i*2+1);
		tt[i].Max=max(tt[i*2].Max,tt[i*2+1].Max);
	}
}
void st3(long long i){
	if(l<=tt[i].rr && r>=tt[i].ll){
		if(l<=tt[i].ll && r>=tt[i].rr){
			da=max(da,tt[i].Max);
			return;
		}
		xia(i);
		st3(i*2);
		st3(i*2+1);
	}
}
int main(){
	cin>>nn>>mm;
	for(int i=1;i<=nn;i++)cin>>a[i];
	jian(1,1,nn);
	for(int i=1;i<=mm;i++){
		cin>>op;
		if(op==1){
			cin>>l>>r>>x;
			st1(1);
		}
		if(op==2){
			cin>>l>>r>>x;
			st2(1);
		}
		if(op==3){
			da=-1234476487885688;
			cin>>l>>r;
			st3(1);
			cout<<da<<endl;
		}
	}
	return 0;
}
2022/7/13 11:20
加载中...