社区讨论

10ps 求调

P1253扶苏的问题参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhjogu08
此快照首次捕获于
2025/11/04 05:54
4 个月前
此快照最后确认于
2025/11/04 05:54
4 个月前
查看原帖
CPP

#include<bits/stdc++.h>
using namespace std;
long long n,a[4000010],m;
struct segmenttree {
	long long l,r;
	long long dat,tat;
} t[40000010];
void build(int k,int l,int r) {
	t[k].l=l;
	t[k].r=r;
	t[k].tat=0;
	t[k].dat=a[k];
	if(l==r) {
		return ;
}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	t[k].dat=max(t[k<<1].dat,t[k<<1|1].dat);
}
void spread(long long  p) {
	if(t[p].tat) {
		t[p*2].tat+=t[p].tat;
		t[p*2].dat+=t[p].tat;
		t[p*2+1].tat+=t[p].tat;
		t[p*2+1].dat+=t[p].tat;
		t[p].tat=0;
	}
}
void modify(long long p,long long l,long long r,long long v) {
	if(l<=t[p].l&&r>=t[p].r) {
		t[p].dat+=v;
		t[p].tat+=v;
		return;
	}
	spread(p);
	long long  mid=(t[p].l+t[p].r)/2;
	if(l<=mid)
		modify(2*p,l,r,v);
	if(r>mid)
		modify(2*p+1,l,r,v);
	t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
void se(long long p,long long l,long long r,long long v) {
	if(l<=t[p].l&&r>=t[p].r) {
		t[p].dat=v;
		return;
	}
	long long  mid=(t[p].l+t[p].r)/2;
	if(l<=mid)
		se(2*p,l,r,v);
	if(r>mid)
		se(2*p+1,l,r,v);
	t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
long long query(long long p,long long l,long long r) {
	if(l<=t[p].l&&t[p].r<=r) {
		return t[p].dat;
	}
	spread(p);
	long long mid=(t[p].l+t[p].r)>>1;
	long long ans=0;
	if(l<=mid)ans=max(ans,query(p*2,l,r));
	if(r>mid)ans=max(ans,query(p*2+1,l,r));
	return ans;
}
signed main() {
	scanf("%lld%lld",&n,&m);
	for(int i=1; i<=n; i++) {
		cin>>a[i];
	}
	build(1,1,n);

	for(long long i=1; i<=m ; i++) {
		long long id,k1,k2;
		scanf("%lld%lld%lld",&id,&k1,&k2);
		if(id==1) {
			cin>>id;
			modify(1,k1,k2,id);
		} else if(id==3) {
			printf("%lld\n",query(1,k1,k2));
		} else {
			cin>>id;
			se(1,k1,k2,id);
		}
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...