【题目分析】
全靠运气,卡空间。
xjb试几次就过了。
【代码】
#include#include #include #include #include using namespace std;#define maxn 200005#define mlog 16#define inf 0x3f3f3f3f#define maxm 4000005#define F(i,j,k) for (int i=j;i<=k;++i)int ch[maxm][2],fa[maxm],siz[maxm],v[maxm],num[maxm],n,m,rt[maxn*5],a[maxn];int L,R,X,C,tot,Pre,Nxt,opt,ans,k,aim;void update(int k){siz[k]=siz[ch[k][0]]+siz[ch[k][1]]+num[k];}int ins(int &k,int fat){ if (!k){k=++tot;num[k]=siz[k]=1;v[k]=C;fa[k]=fat;ch[k][0]=ch[k][1]=0;return k;} siz[k]++; if (C==v[k]) {num[k]++;return k;} else if (C >1; splay(ins(rt[o],0),rt[o]); if (l==r) return; if (X<=mid) add(o<<1,l,mid); else add(o<<1|1,mid+1,r);}void qrk(int k){ if (!k) return; if (v[k] >1; if (L<=mid) queryrk(o<<1,l,mid); if (R>mid) queryrk(o<<1|1,mid+1,r);}void qpr(int k){ if (!k) return; if (v[k]>=C) return qpr(ch[k][0]); else{Pre=max(Pre,v[k]); return qpr(ch[k][1]);}}void querypr(int o,int l,int r){ if (L<=l&&r<=R){qpr(rt[o]);return;} int mid=l+r>>1; if (L<=mid) querypr(o<<1,l,mid); if (R>mid) querypr(o<<1|1,mid+1,r);}void qnt(int k){ if (!k) return; if (v[k]<=C) return qnt(ch[k][1]); else{Nxt=min(Nxt,v[k]); return qnt(ch[k][0]);}}void querynt(int o,int l,int r){ if (L<=l&&r<=R){qnt(rt[o]);return;} int mid=l+r>>1; if (L<=mid) querynt(o<<1,l,mid); if (R>mid) querynt(o<<1|1,mid+1,r);}void del(int &k){ if (v[k]==C) { if (num[k]>1) { num[k]--; siz[k]--; splay(k,rt[aim]); return ; } else { if (ch[k][0]*ch[k][1]==0) { if ((!ch[k][0])&&(!ch[k][1])) {k=0;return;} if (!ch[k][0]) fa[ch[k][1]]=fa[k]; else fa[ch[k][0]]=fa[k]; k=ch[k][0]+ch[k][1]; return ; } else { int tmp=rand()%2; rot(ch[k][tmp],k); del(k); return ; } } } siz[k]--; if (v[k]