求助卡常
查看原帖
求助卡常
132533
FutaRimeWoawaSete楼主2024/7/12 16:26

RT,qw。qwq,

#include "bits/stdc++.h"
using namespace std;
#define ll long long
const int Len = 5e5 + 5;
const ll Inf = 1e16;
inline int read()
{
	int x = 0 , f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
	while('0' <= ch && ch <= '9'){x = (x << 3) + (x << 1) + ch - '0';ch = getchar();}
	return x * f;
}
void write(ll x){if(x < 0){putchar('-');x = -x;}if(x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeN(ll x){write(x) , putchar('\n');}
ll mxad[Len],mxa[Len],mxln[Len],add[Len],a[Len],mxnn[Len];
int B,L[Len],R[Len],pos[Len],sizb,pa[Len],n,m,vis[Len];
inline void push_down(int p)
{
	mxa[p] = -Inf;
	for(int i = L[p] ; i <= R[p] ; i ++) 
	{
		mxln[i] = max(mxln[i] , a[i] + mxad[p]);
		a[i] = a[i] + add[p];
	}
	add[p] = mxad[p] = vis[p] = 0;
}
inline bool cmp(int x,int y){return a[x] < a[y];}
inline void upd(int p,int l,int r,int x)
{
	if(vis[p]) push_down(p);
	for(int i = l ; i <= r ; i ++) 
	{
		a[i] += x;
		mxln[i] = max(mxln[i] , a[i]);
	}
	sort(pa + L[p] , pa + R[p] + 1 , cmp);
	mxnn[L[p]] = mxln[pa[L[p]]] , mxa[L[p]] = a[pa[L[p]]];int id = 0;
	for(int i = L[p] + 1 ; i <= R[p] ; i ++)
	{
		id = pa[i];
		mxnn[i] = max(mxnn[i - 1] , mxln[id]);
		mxa[i] = max(mxa[i - 1] , a[id]);
	}
}
inline void Upd(int l,int r,int x)
{
	int pl = pos[l] , pr = pos[r];
	upd(pl , l , R[pl] , x);
	for(int p = pl + 1 ; p <= pr - 1 ; p ++)
	{
		add[p] += x;
		mxad[p] = max(mxad[p] , add[p]);
		vis[p] = 1;
	}
	upd(pr , L[pr] , r , x);
}
inline ll qry(int l,int r,int x)
{
	ll ans = -Inf;
	int pl = pos[l] , pr = pos[r];
	if(pl == pr)
	{
		if(vis[pl]) push_down(pl);
		for(int i = l ; i <= r ; i ++)  if(a[i] < x) ans = max(ans , mxln[i]); 
		return ans;
	}
	if(vis[pl]) push_down(pl);
	for(int i = l ; i <= R[pl] ; i ++) if(a[i] < x) ans = max(ans , mxln[i]); 
	int id = 0;
	for(int p = pl + 1 ; p <= pr - 1 ; p ++)
	{
		id = lower_bound(pa + L[p] , pa + R[p] + 1 , x - add[p] , cmp) - pa - 1;
		if(id >= L[p]) ans = max(ans , max(mxnn[id] , mxa[id] + mxad[p]));
	}
	if(vis[pr]) push_down(pr);
	for(int i = L[pr] ; i <= r ; i ++) if(a[i] < x) ans = max(ans , mxln[i]); 
	return ans;
}
inline void init(){for(int i = 1 ; i <= n ; i ++) pa[i] = i , mxln[i] = -Inf;for(int i = 1 ; i <= sizb ; i ++) vis[i] = add[i] = 0 , mxad[i] = -Inf;}
signed main()
{
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	n = read() , m = read();B = sqrt(n);sizb = max(1 , n / B);init();
	for(int i = 1 ; i <= n ; i ++) a[i] = read();
	for(int i = 1 ; i <= sizb ; i ++) 
	{
		L[i] = (i - 1) * B + 1;
		R[i] = i * B;
	}
	if(R[sizb] < n)
	{
		sizb ++;
		L[sizb] = R[sizb - 1] + 1;
		R[sizb] = n;
	}
	for(int i = 1 ; i <= sizb ; i ++) upd(i , L[i] , R[i] , 0);
	int o,l,r,x;
	for(int i = 1 ; i <= m ; i ++)
	{
		o = read() , l = read() , r = read() , x = read();
		if(o == 1) Upd(l , r , x);
		else 
		{
			ll res = qry(l , r , x);
			if(res <= -Inf) puts("-inf");
			else writeN(res);
		}
	}
	return 0;
}
2024/7/12 16:26
加载中...