60pts 再次求调
查看原帖
60pts 再次求调
868063
_Coffice_楼主2023/5/24 18:01
#include<iostream>
using namespace std;
struct node
{
	long long v;
	long long l,r;
	long long tag_add,tag_upd;
	bool ta,tu;
};
node t[5000005];
long long a[1000005];
inline void f_upd(long long p,long long x)
{
	t[p].tag_upd = x;
	t[p].v = x;
	t[p].tu = 1;
	t[p].ta = 0;
	t[p].tag_add = 0;
	return ;
}
inline void down_upd(long long p)
{
	if(t[p].tu != 0)
	{
		f_upd(p*2,t[p].tag_upd);
		f_upd(p*2+1,t[p].tag_upd);
		t[p].tag_upd = 0;
		t[p].tu = 0;
		return ;
	}
}
inline void f_add(long long p,long long x)
{
	down_upd(p);
	t[p].tag_add += x;
	t[p].v += x;
	t[p].ta = 1;
	return ;
}
inline void down_add(long long p)
{
	down_upd(p);
	if(t[p].ta != 0)
	{
		f_add(p*2,t[p].tag_add);
		f_add(p*2+1,t[p].tag_add);
		t[p].tag_add = 0;
		t[p].ta = 0;
		return ;
	}
}
void js(long long p,long long l,long long r)
{
	t[p].l = l;
	t[p].r = r;
	t[p].tag_add = t[p].tag_upd = 0;
	t[p].ta = t[p].tu = 0;
	if(l == r)
	{
		t[p].v = a[l];
		return ;
	}
	long long mid = (l+r)/2;
	js(p*2,l,mid);
	js(p*2+1,mid+1,r);
	t[p].v = max(t[p*2].v,t[p*2+1].v);
	return ;
}
long long max_(long long p,long long l,long long r)
{
	if(l <= t[p].l && r >= t[p].r)
	{
		return t[p].v;
	}
	long long mid = (t[p].l+t[p].r)/2;
	long long ans = -100000000007;
	down_upd(p);
	down_add(p);
	if(l <= mid)
	{
		ans = max_(p*2,l,r);
	}
	if(r >= mid+1)
	{
		ans = max(ans,max_(p*2+1,l,r));
	}
	if(ans == -100000000007)
	{
		return -1;
	}
	else
		return ans;
}
void upd(long long p,long long l,long long r,long long x)
{
	if(t[p].l >= l && t[p].r <= r)
	{
		t[p].tu = 1;
		t[p].tag_upd = x;
		t[p].ta = 0;
		t[p].tag_add = 0;
		t[p].v = x;
		return ;
	}
	long long mid = (t[p].l+t[p].r)/2;
	if(l <= mid)
	{
		upd(p*2,l,r,x);
	}
	if(r >= mid+1)
	{
		upd(p*2+1,l,r,x);
	}
	down_upd(p);
	down_add(p);
	t[p].v = max(t[p*2].v,t[p*2+1].v);
	return ;
}
void add(long long p,long long l,long long r,long long x)
{
	if(t[p].l >= l && t[p].r <= r)
	{
		down_upd(p);
		t[p].ta = 1;
		t[p].tag_add += x;
		t[p].v += x;
		return ;
	}
	long long mid = (t[p].l+t[p].r)/2;
	if(l<=mid)
	{
		add(p*2,l,r,x);
	}
	if(r >= mid+1)
	{
		add(p*2+1,l,r,x);
	}
	down_upd(p);
	down_add(p);
	t[p].v = max(t[p*2].v,t[p*2+1].v);
}
int main()
{
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	long long n,q;
	cin >> n >> q;
	for(long long i=1;i<=n;i++)
	{
		cin >> a[i];
	}
	js(1,1,n);
	for(long long i=1;i<=q;i++)
	{
		long long op;
		cin >> op;
		if(op == 1)
		{
			long long l,r,x;
			cin >> l >> r >> x;
			upd(1,l,r,x);
		}
		else if(op == 2)
		{
			long long l,r,x;
			cin >> l >> r >> x;
			add(1,l,r,x);
		}
		else
		{
			long long l,r;
			cin >> l >> r;
			cout << max_(1,l,r) << endl;
		}
	}
	return 0;
}

7,8,9,10 WA

改了好久,还是不对,求教

@-扶苏-

2023/5/24 18:01
加载中...