区间赋值+区间最大值线段树求条
  • 板块学术版
  • 楼主0v_0___SYC
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/17 17:58
  • 上次更新2024/9/17 18:04:26
查看原帖
区间赋值+区间最大值线段树求条
767155
0v_0___SYC楼主2024/9/17 17:58
#include<bits/stdc++.h>
using namespace std;

struct node{
	long long l,r,lazy;
	long long ans;
};

int n,m;
long long d[100009];
node tree[400009];

void pushdown(long long i){
	tree[i*2].lazy =tree[i].lazy;
	tree[i*2+1].lazy = tree[i].lazy;
	tree[i*2].ans = tree[i].lazy;
	tree[i*2+1].ans = tree[i].lazy;
	tree[i].lazy = 0;
}

long long ask(long long i,long long l,long long r){
	long long t;
	if(tree[i].r <= r && tree[i].l >= l) return tree[i].ans;
	if(tree[i].lazy != 0) pushdown(i);
	t = 0;
	if(tree[i*2].r >= l) t=max(ask(i*2,l,r),t);
	if(tree[i*2 + 1].l <= r) t=max(ask(i*2+1,l,r),t);
	return t;
}

void change(long long i,long long l,long long r,long long k){
	if(tree[i].r <= r && tree[i].l >= l){
		tree[i].ans=k;
		tree[i].lazy=k;
		return;
	}
	if(tree[i].lazy != 0) pushdown(i);
	if(tree[i*2].r >= l) change(i*2,l,r,k);
	if(tree[i*2+1].l <= r) change(i*2+1,l,r,k);
	tree[i].ans = tree[i*2].ans + tree[i*2+1].ans;
}

void build(long long i,long long l,long long r){
	long long mid = 0;
	tree[i].l = l;
	tree[i].r = r;
	if(l == r)
	{
		tree[i].ans =d[r];
		return;
	}
	mid = (l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	tree[i].ans = max(tree[i*2].ans,tree[i*2+1].ans);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i<=n;i++) cin >> d[i];
	build(1,1,n);
	for(int i = 1;i<=m;i++)
	{
		int p;
		cin >> p;
		if( p == 1)
		{
			long long x,y,k;
			cin >> x >> y >> k; 
			change(1,x,y,k);
		}else
		{
			long long x,y;
			cin >> x >> y;
			cout << ask(1,x,y) << "\n";
		}
	}
}
2024/9/17 17:58
加载中...