求调
查看原帖
求调
1251882
123456adgj楼主2024/11/9 13:40
#include<bits/stdc++.h>
using namespace std;
int n,m,sum[1000000],a[1000000],op,xa,xy,k,tag[1000000];
long long lt(long long x){return x<<1;}
long long rt(long long x){
	return x<<1|1;
}
void up(long long x){
	sum[x]=max(sum[lt(x)],sum[rt(x)]);
}
void build(long long p,long long l,long long r){
	if(l==r){
		sum[p]=a[l];
		return;
	}
long long mid=l+r>>1;
build(lt(p),l,mid);
build(rt(p),mid+1,r);
up(p);
}
void f(long long k,long long p,long long l,long long r){
	tag[p]+=k;
	sum[p]+=k;
}
void push_down(long long l,long long r,long long p){
	long long mid=l+r>>1;
	f(tag[p],lt(p),l,mid);
	f(tag[p],rt(p),mid+1,r);
	tag[p]=0;
}
void ca(long long l,long long r,long long p,long long k,long long xa,long long xy){
	if(l>=xa&&r<=xy){
		tag[p]+=k;
		sum[p]+=k;
		return;
	}
	push_down(l,r,p);
	long long mid=l+r>>1;
	if(xa<=mid)ca(l,mid,lt(p),k,xa,xy);
	if(xy>mid)ca(mid+1,r,rt(p),k,xa,xy);
	up(p);
}
void cao(long long l,long long r,long long p,long long k,long long xa,long long xy){
	if(l>=xa&&r<=xy){
		tag[p]=0;
		sum[p]=k;
		return;
	}
	long long mid=l+r>>1;
	if(xa<=mid)cao(l,mid,lt(p),k,xa,xy);
	if(xy>mid)cao(mid+1,r,rt(p),k,xa,xy);
	up(p);
}
long long query(long long l,long long r,long long p,long long xa,long long xy){
	long long res=0;
	if(l>=xa&&r<=xy)return sum[p];
	push_down(l,r,p);
	long long mid=l+r>>1;
	if(xa<=mid)res=max(res,query(l,mid,lt(p),xa,xy));
	if(xy>mid)res=max(res,query(mid+1,r,rt(p),xa,xy));
	return res;
}
int main(){
	cin>>n>>m;
	memset(sum,-1000000,sizeof(sum));
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&op,&xa,&xy);
		if(op==2){
			scanf("%d",&k);
			ca(1,n,1,k,xa,xy);
		}
		else if(op==1){
			scanf("%d",&k);
			cao(1,n,1,k,xa,xy);
		}
		else{
			cout<<query(1,n,1,xa,xy)<<endl;
		}
	}
	
	
	return 0;
} 
2024/11/9 13:40
加载中...