二逼平衡树
link
原题就叫这名字,虽然我并没有看出来它二逼在哪里。
就是一个线段树套平衡树的模板,挺好理解也挺好写,除了手抖收获了一片RE之外一切都挺顺利的,开了\(O_2\)随便过【逃】。
#include
#include
#include
//#define zczc
using namespace std;
const int N=50010;
const int maxn=2147483647;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
inline int min(int s1,int s2){
return s11)return t[wh].num--,t[wh].sum--,wh;
if(!lc&&!rc)return 0;
wh=t[lc].p>t[rc].p?zig(wh):zag(wh);
}
if(val=val)return getmax(lc,val);
else return max(t[wh].data,getmax(rc,val));
}
void dfs(int wh){
if(!wh)return;
printf("%d %d %d %d %d&%d\n",wh,t[wh].data,t[wh].num,t[wh].sum,lc,rc);
dfs(lc);dfs(rc);
}
#undef lc
#undef rc
}
//线段树部分
namespace b{
#define lc (wh<<1)
#define rc (wh<<1|1)
#define mid (t[wh].l+t[wh].r>>1)
struct node{
int l,r,mi,ma,root;
}t[N<<2];
int ss[N],bef;bool dell;
inline void pushup(int wh){
t[wh].mi=min(t[lc].mi,t[rc].mi);
t[wh].ma=max(t[lc].ma,t[rc].ma);
}
inline void build(int wh,int l,int r){
t[wh].l=l,t[wh].r=r,t[wh].root=0;if(l==r)return;
build(lc,l,mid);build(rc,mid+1,r);
}
inline void insert(int wh,int pl,int val){
//if(wh==1)printf("working %d\n",val);
//printf("%d %d %d %d %d\n",wh,t[wh].l,t[wh].r,pl,val);
t[wh].root=a::insert(t[wh].root,val);
if(t[wh].l==t[wh].r)bef=ss[t[wh].l],ss[t[wh].l]=val;//,printf("end%d\n",wh)
else insert(pl<=mid?lc:rc,pl,val);
if(dell)t[wh].root=a::del(t[wh].root,bef);
}
inline int rank(int wh,int wl,int wr,int val){
if(wl<=t[wh].l&&t[wh].r<=wr)return a::rank(t[wh].root,val);
int an=0;if(wl<=mid)an+=rank(lc,wl,wr,val);
if(wr>mid)an+=rank(rc,wl,wr,val);return an;
}
inline int get(int wl,int wr,int rk){
int l=-1,r=maxn,midd;
while(l>1)mid)an=min(an,getmin(rc,wl,wr,val));return an;
}
inline int getmax(int wh,int wl,int wr,int val){
if(wl<=t[wh].l&&t[wh].r<=wr)return a::getmax(t[wh].root,val);
int an=-maxn;if(wl<=mid)an=max(an,getmax(lc,wl,wr,val));
if(wr>mid)an=max(an,getmax(rc,wl,wr,val));return an;
}
#undef lc
#undef rc
#undef mid
}
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
srand(time(0));int m,n,op,s1,s2,s3;read(m);read(n);b::build(1,1,m);
for(int i=1;i<=m;i++){read(s1);b::ss[i]=s1;b::insert(1,i,s1);}
//a::dfs(b::t[1].root);
b::dell=true;
//printf("%d\n",b::rank(1,1,4,3));
for(int i=1;i<=n;i++){
//if(i%100==0)printf("now:%d\n",i);
read(op);
switch(op){
case 1:
read(s1);read(s2);read(s3);
printf("%d\n",b::rank(1,s1,s2,s3)+1);break;
case 2:
read(s1);read(s2);read(s3);
printf("%d\n",b::get(s1,s2,s3));break;
case 3:
read(s1);read(s2);b::insert(1,s1,s2);break;
case 4:
read(s1);read(s2);read(s3);
printf("%d\n",b::getmax(1,s1,s2,s3));break;
case 5:
read(s1);read(s2);read(s3);
printf("%d\n",b::getmin(1,s1,s2,s3));break;
}
}
//*/
return 0;
}