FHQ 全 MLE 求助
查看原帖
FHQ 全 MLE 求助
688783
SilverLi楼主2023/5/25 21:22
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct FHQ {
    int si,pr,l,r;
	int v,ad,re,mx;
}t[N];
int n,Q,pos,root;
#define lx(x) t[x].l
#define rx(x) t[x].r
inline void upd(int u) {
    t[u].si=t[lx(u)].si+t[rx(u)].si+1;
    t[u].mx=t[u].v;
    if(lx(u))
		t[u].mx=max(t[u].mx,t[lx(u)].mx);
    if(rx(u))
		t[u].mx=max(t[u].mx,t[rx(u)].mx);
}
inline void down(int u) {
    if(t[u].re) {
        if(lx(u))	t[lx(u)].re^=1;
        if(rx(u))	t[rx(u)].re^=1;
        lx(u)^=rx(u)^=lx(u)^=rx(u);
        t[u].re=0;
    }
    if(t[u].ad) {
        if(lx(u)) {
            t[lx(u)].ad+=t[u].ad,
            t[lx(u)].v+=t[u].ad,
            t[lx(u)].mx+=t[u].ad;
        }
        if(rx(u)) {
            t[rx(u)].ad+=t[u].ad;
            t[rx(u)].v+=t[u].ad;
            t[rx(u)].mx+=t[u].ad;
        }
        t[u].ad=0;
        upd(u);
    }
}
int merge(int u,int v) {
    if(u==0||v==0)	return u+v;
    down(u),down(v);
    if(t[u].pr<t[v].pr) {
        rx(u)=merge(lx(u),v);
        upd(u);
        return u;
    }
    else {
		lx(v)=merge(u,lx(v));
		upd(v);
		return v;
	}
}
void split(int u,int key,int &L,int &R) {
    if(u==0) {
		L=R=0;
		return;
	}
    down(u);
    if(t[lx(u)].si>=key) {
		R=u;
		split(lx(u),key,L,lx(R));
	}
    else {
		L=u;
		split(rx(u),key-t[lx(u)].si-1,rx(L),R);
	}
    upd(u);
}
inline void ins(int val) {
    t[++pos].pr=rand(),
    t[pos].v=val,t[pos].mx=val,
	t[pos].si=1;
    root=merge(root,pos);
}
inline void add(int l,int r,int w) {
    int a,b,c;
    split(root,l-1,a,b);
    split(b,r-l+1,b,c);
    t[b].mx+=w,t[b].ad+=w,t[b].v+=w;
    root=merge(merge(a,b),c);
}
inline void rev(int l,int r) {
    int a,b,c;
    split(root,l-1,a,b);
    split(b,r-l+1,b,c);
    t[b].re^=1;
    root=merge(merge(a,b),c);
}
inline void maxx(int l,int r) {
    int a,b,c;
    split(root,l-1,a,b);
    split(b,r-l+1,b,c);
    cout<<t[b].mx<<'\n';
    root=merge(merge(a,b),c);
}
signed main() {
    cin>>n>>Q;
    for(int i=1;i<=n;++i)	ins(0);
    while(Q--) {
		int opt,l,r,w;
        cin>>opt>>l>>r;
        if(opt==1) {
			cin>>w;
			add(l,r,w);
		} else if(opt==2) {
			rev(l,r);
		} else if(opt==3) {
			maxx(l,r);
		}
    }
    return 0;
}

2023/5/25 21:22
加载中...