萌新袜子刚学 FHQTreap 全 WA 求助
查看原帖
萌新袜子刚学 FHQTreap 全 WA 求助
759710
LuoFeng_Nanami楼主2023/12/18 22:41
#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i,a,b) for(rll i=a;i<=b;i++)
#define Fdn(i,a,b) for(rll i=a;i>=b;i--)
#define int ll

using namespace std;

const int inf = 0x3f3f3f3f,mod = 1e9 + 7; 
const int maxn = 1e5 + 7;

namespace FHQTreapPlus{
	int root, tot, ls[maxn], rs[maxn], val[maxn], rnd[maxn], siz[maxn], tag[maxn], add[maxn], mx[maxn];
	
	inline void PushUp(int p){
		siz[p] = siz[ls[p]] + 1 + siz[rs[p]],
		mx[p] = max(mx[ls[p]], max(mx[rs[p]], val[p]));
	}
	
	inline int New(int v){
		int x = ++tot;
		siz[x] = 1, val[x] = v, rnd[x] = rand();
		return x;
	}
	
	inline void PushDown(int p){
		if(tag[p]){
			tag[ls[p]] ^= 1, tag[rs[p]] ^= 1,
			tag[p] = 0;
			swap(ls[p], rs[p]);
		} 
		if(add[p]){
			add[ls[p]] += add[p], add[rs[p]] += add[p],
			mx[ls[p]] += add[p], mx[rs[p]] += add[p],
			val[ls[p]] += add[p], val[rs[p]] += add[p],
			add[p] = 0;
		}
	}
	
	inline void Split(int p, int v, int &x, int &y){
		if(!p){
			x = y = 0;
			return;
		}
		PushDown(p);
		if(siz[ls[p]] >= v) y = p, Split(ls[p], v, x, ls[y]);
		else x = p, Split(rs[p], v - siz[ls[p]] - 1, rs[x], y);
		PushUp(p);
	}
	
	inline int Merge(int x, int y){
		if(!x || !y) return x | y;
		PushDown(x), PushDown(y);
		if(rnd[x] > rnd[y]) {
			rs[x] = Merge(rs[x], y);
			PushUp(x);
			return x;
		}
		else {
			ls[y] = Merge(x, ls[y]);
			PushUp(y);
			return y;
		}
	}
} 

using namespace FHQTreapPlus;

int n, m;

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	srand(time(0));
	cin >> n >> m;
	mx[0] = LLONG_MIN; 
	F(i, 1, n) root = Merge(root, New(0));
	F(i, 1, m){
		int op, l, r, v;
		cin >> op >> l >> r;
		if(op == 1) {
			cin >> v;
			int x, y, z;
			Split(root, r, x, z), Split(x, l - 1, x, y);
			add[y] += v, val[y] += v, mx[y] += v;
			root = Merge(Merge(x, y), z);
		} else if(op == 2) {
			int x, y, z;
			Split(root, r, x, z), Split(x, l - 1, x, y);
			tag[y] ^= 1;
			root = Merge(Merge(x, y), z);
		} else if(op == 3) {
			int x, y, z;
			Split(root, r, x, z), Split(x, l - 1, x, y);
			cout << mx[y] << '\n';
			root = Merge(Merge(x, y), z);
		}
	}
	
	return 0;
}```
2023/12/18 22:41
加载中...