FHQ 20分求调
查看原帖
FHQ 20分求调
1059930
Flame_HuTao楼主2024/1/11 16:24

WAWA 前 44 点

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=100005;
namespace Splay{
	int tot=0,head=0;
	int sz[N],val[N],h[N][2],fa[N],lazy[N],maxv[N],cnt[N],lazy0[N],key[N];
	bool get(int x){return h[fa[x]][1]==x;}
	void maintain(int x){
		if(!x)return ;
		val[h[x][0]]+=lazy0[x];
		maxv[h[x][0]]+=lazy0[x];
		lazy0[h[x][0]]+=lazy0[x];
		val[h[x][1]]+=lazy0[x];
		maxv[h[x][1]]+=lazy0[x];
		lazy0[h[x][1]]+=lazy0[x];
		sz[x]=sz[h[x][1]]+sz[h[x][0]]+cnt[x];lazy0[0]=val[0]=maxv[0]=0; 
		maxv[x]=max(max(val[h[x][0]],maxv[h[x][0]]),max(val[h[x][1]],maxv[h[x][1]]));
		lazy0[x]=0;
	} 
	void pushdown(int x){
		if(lazy[x]){
			lazy[h[x][0]]^=1;lazy[h[x][1]]^=1;
			swap(h[x][0],h[x][1]);lazy[x]=0;
		}
	} 
	void rotate(int x){
		int y=fa[x],z=fa[y],d=get(x);
		maintain(y);maintain(x);
		h[y][d]=h[x][d^1];
		if(h[x][d^1])fa[h[x][d^1]]=y;
		h[x][d^1]=y;
		if(z)h[z][y==h[z][1]]=x;
		fa[y]=x;fa[x]=z;fa[0]=0;
		maintain(y),maintain(x);
	}
	void splay(int x){
		for(int i=fa[x];i=fa[x],i;rotate(x)){
			if(fa[i])rotate(get(x)==get(i)?i:x);
		} head=x;
	}
	void splay0(int x,int goal){
		for(int i;(i=fa[x])!=goal;rotate(x)){
			if (fa[i]!=goal)rotate((get(x)==get(i))?i:x); 
		} if(goal==0)head=x;
	}
	void ins(int k){
		if(!head){
			head=++tot;key[tot]=k;
			cnt[tot]++;maintain(head);
			return ;
		} int cur=head,f=0;
		while(1){
			f=cur;cur=h[cur][key[cur]<k];
			if(!cur){
				key[++tot]=k;cnt[tot]++;
				fa[tot]=f;h[f][key[f]<k]=tot;
				maintain(tot);maintain(f);
				splay(tot);break;
			}
		}
	}
	int rank(int k){
		int cur=head;
		while(1){
			pushdown(cur);maintain(cur);
			if(h[cur][0]&&k<=sz[h[cur][0]])
				cur=h[cur][0];
			else {
				int tmp=sz[h[cur][0]]+1;
				if(k<=tmp)return key[cur];
				k-=tmp;cur=h[cur][1];
			}
		}
	}
	void reverse(int l,int r){
		l=rank(l);r=rank(r+2);
		splay0(l,0);splay0(r,l);
		lazy[h[h[head][1]][0]]^=1;
	}
	void merge(int l,int r,int key){
		l=rank(l);r=rank(r+2);
		splay0(l,0);splay0(r,l);
		val[h[h[head][1]][0]]+=key;
		lazy0[h[h[head][1]][0]]+=key;
		maintain(h[h[head][1]][0]);
	}
	int forward(int l,int r){
		l=rank(l);r=rank(r+2);
		splay0(l,0);splay0(r,l);
		return max(maxv[h[h[head][1]][0]],val[h[h[head][1]][0]]);
	}
}
signed main()
{
	int n,t0;cin>>n>>t0;
	for(int i=1;i<=n+2;i++)
		Splay::ins(i);
		while(t0--){
		int opt,l,r,w;
		cin>>opt>>l>>r;
		if(opt==1)cin>>w,
		Splay::merge(l,r,w);
		if(opt==2)Splay::reverse(l,r);
		if(opt==3)cout<<Splay::forward(l,r)<<"\n";
	}
	return 0;
}
2024/1/11 16:24
加载中...