P1253 扶苏的问题求调,玄关,20pts
  • 板块灌水区
  • 楼主zzx1228
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/10 20:06
  • 上次更新2024/4/10 21:49:40
查看原帖
P1253 扶苏的问题求调,玄关,20pts
996601
zzx1228楼主2024/4/10 20:06

AC ON 1,3

#include<iostream>
using namespace std;
#define int long long
const int N = 1e6 + 7;
const long long INF = -1e18 ;
const int UN = 2e9 ;
int n,m;
int a[N];

struct SegmentTree{
	int l,r;
	long long data;
	long long add;
	long long to;
}t[4 * N];

void build(int p,int l,int r){
	t[p].to = UN;
	t[p].l = l;
	t[p].r = r;
	if(l == r){
		t[p].data = a[l];
		return ;
	}
	int mid = (l + r) / 2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].data = max(t[p*2].data,t[p*2+1].data);
	return ;
}

void spread(int p){
	if(t[p].to != UN){
		t[p*2].data = t[p].to;
		t[p*2+1].data = t[p].to;
		t[p*2].to = t[p].to;
		t[p*2+1].to = t[p].to;
		t[p*2].add = 0;
		t[p*2+1].add = 0;
		t[p].to = UN;
	}
	if(t[p].add){
		t[p*2].data += t[p].add;
		t[p*2+1].data += t[p].add;
		t[p*2].add += t[p].add;
		t[p*2+1].add += t[p].add;
		t[p].add = 0;
	}
	return ;
}

void change1(int p,int l,int r,int v){
	if(l <= t[p].l && r >= t[p].r){
		t[p].data = v;
		t[p].to = v;
		t[p].add = 0;
		return ;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) / 2;
	if(l <= mid) change1(p*2,l,r,v);
	if(r > mid) change1(p*2+1,l,r,v);
	t[p].data = max(t[p*2].data,t[p*2+1].data);
	return ;
}

void change2(int p,int l,int r,int v){
	if(l <= t[p].l && r >= t[p].r){
		t[p].data += v;
		t[p].add += v;
		return ;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) / 2;
	if(l <= mid) change2(p*2,l,r,v);
	if(r > mid) change2(p*2+1,l,r,v);
	t[p].data = max(t[p*2].data,t[p*2+1].data);
	return ;
}

long long ask(int p,int l,int r){
	if(l <= t[p].l && r >= t[p].r){
		return t[p].data;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) / 2;
	long long val = INF;
	if(l <= mid) val = max(val,ask(p*2,l,mid));
	if(r > mid) val = max(val,ask(p*2+1,mid+1,r));
	return val;
}

signed main(){
	cin>>n>>m;
	for(int i = 1;i <= n;i++)scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		int type,l,r;
		scanf("%lld%lld%lld",&type,&l,&r);
		if(type == 1){
			int k;
			scanf("%lld",&k);
			change1(1,l,r,k);
		}
		else if(type == 2){
			int k;
			scanf("%lld",&k);
			change2(1,l,r,k);
		}
		else{
			printf("%lld\n",ask(1,l,r));
		}
	}
	
	return 0;
}
2024/4/10 20:06
加载中...