$\texttt{MnZn}$ 求助线段树
查看原帖
$\texttt{MnZn}$ 求助线段树
393864
Elgo87楼主2022/1/8 13:17

https://www.luogu.com.cn/record/66403840

悬赏....悬赏一个贴贴(

#include <bits/stdc++.h>
using namespace std;

inline int read() {
	int num=0, nev=1;  char ch = getchar();
	while(!isdigit(ch)){ if(ch=='-') nev=-1; ch=getchar(); }
	while (isdigit(ch)){ num=(num<<1)+(num<<3)+(ch^48); ch=getchar(); }
	return num * nev;
}

inline void print(const long long& x) {
	if (x<0) {print(-x);  return;}
	if (x<10) { putchar(x+'0');  return; }
	print(x/10); putchar(x%10+'0'); return;
}

long long tree[1145141 << 2];    //线段树
long long add[1145141 << 2];     //加法标记
long long change[1145141 << 2];  //改数标记
long long a[114514 << 2];

void build(int k, int l, int r)
{
	if(l==r) tree[k] = a[l];
	else {
		int mid = l + r >> 1;
		build(k<<1, l, mid);
		build(k<<1 | 1, mid+1, r);
		tree[k] = max(tree[k<<1] , tree[k<<1 | 1]);
	}
	return;
}

void Add(int k, int l, int r, int v)  //区间加
{
	add[k] += v;
	tree[k] += (r-l+1) * (long long) v;
	return ;
}

void Change(int k, int l, int r, int v)  //区间修改
{
	change[k] = v;
	tree[k] = v;
	add[k] = 0;
	return ;
}

void pushdown(int k, int l, int r, int mid)
{
	if (add[k])
	{
		Add(k<<1, l, mid, add[k]);
		Add(k<<1 | 1, mid+1, r, add[k]);
		add[k] = 0;
	}
	if (change[k])
	{
		Change(k<<1, l, mid, change[k]);
		Change(k<<1 | 1, mid+1, r, change[k]);
		change[k] = 0;
	}
	return ;
}

void modify_add(int k, int l, int r, int x, int y, int v)
{
	if (x<=l && r<=y)
	{
		Add(k,l,r,v);
		return;
	}
	if (l>x || r<y)
	{
		return;
	}
	
	int mid = l + r >> 1;
	pushdown(k, l, r, mid);
	modify_add(k<<1, l, mid, x, y, v);
	modify_add(k<<1 | 1, mid+1, r, x, y, v);
	tree[k] = max( tree[k<<1] , tree[k<<1 |1]);
}

void modify_change(int k, int l, int r, int x, int y, int v)
{
	if (x <= l && r <= y)
	{
		Change(k,l,r,v);
		return;
	}
	if (l>x || r<y) return;
	
	int mid =l + r >> 1;
	pushdown(k, l, r, mid);
	modify_change(k<<1, l, mid, x, y, v);
	modify_change(k<<1 | 1, mid+1, r, x, y, v);
	tree[k] = max ( tree[k<<1], tree[k<<1 | 1] );
	return;
}

long long query(int k, int l, int r, int x, int y)
{
	if (x<=l && r<=y)   return tree[k];
	if (l>y || r<x)     return -1145141919810;
	
	int mid = l + r >> 1;
	pushdown(k, l, r, mid);

	return max(query(k<<1,l,mid,x,y) , query(k<<1 | 1, mid+1, r, x, y));
}

int main()
{
	int n=read(), m = read();
	for (int i = 1;  i <= n;  i ++)
		a[i] = read();
	build(1,1,n);
	
	for (int i = 1; i <= m;  i ++)
	{
		int op = read();
		if (op==1)
		{
			int l = read(),  r = read(),  x = read();
			modify_change(1,1,n,l,r,x);
		}
		else
		{
			if (op==2)
			{
				int l = read(),  r = read(),  x = read();
				modify_add(1,1,n,l,r,x);
			}else{
				int l = read(), r = read();
				printf("%lld\n",query(1,1,n,l,r));
			}
		}
		
	}
}
2022/1/8 13:17
加载中...