直接上,多一个数组记编号。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxm 51000
#define maxn 210000
int getint()
{
char c;
int res;
while(c=getchar(),c<'0'||c>'9');
res=c-'0';
while(c=getchar(),c>='0'&&c<='9')
res=res*10+c-'0';
return res;
}
int n,m,l,r,root,cnt,col[maxn],val[maxn],ls[maxn],rs[maxn],siz[maxn];
void rotate_r(int &x)
{
int y=ls[x];
siz[y]=siz[x];
ls[x]=rs[y];
rs[y]=x;
siz[x]=siz[ls[x]]+siz[rs[x]]+1;
x=y;
}
void rotate_l(int &x)
{
int y=rs[x];
siz[y]=siz[x];
rs[x]=ls[y];
ls[y]=x;
siz[x]=siz[ls[x]]+siz[rs[x]]+1;
x=y;
}
void maintain(int& x,int fg)
{
if(!fg)
{
if(siz[ls[ls[x]]]>siz[rs[x]]) rotate_r(x);
else if(siz[rs[ls[x]]]>siz[rs[x]]) rotate_l(ls[x]),rotate_r(x);
else return ;
}
else
{
if(siz[rs[rs[x]]]>siz[ls[x]]) rotate_l(x);
else if(siz[ls[rs[x]]]>siz[ls[x]]) rotate_r(rs[x]),rotate_l(x);
else return ;
}
maintain(ls[x],0);maintain(rs[x],1);
maintain(x,0);maintain(x,1);
}
void insert(int& x,int b,int id)
{
if(!x)
{
cnt++;
x=cnt;
ls[x]=rs[x]=0;
siz[x]=1;
val[x]=b;
col[x]=id;
}
else
{
siz[x]++;
if(b>val[x]) insert(rs[x],b,id);
else insert(ls[x],b,id);
maintain(x,b>=val[x]);
}
}
int delt(int& x,int b)
{
siz[x]--;
if(b==val[x]||(b<val[x]&&ls[x]==0)||(b>val[x]&&rs[x]==0))
{
int y=val[x];
if(ls[x]==0||rs[x]==0) x=ls[x]+rs[x];
else
{
int z=delt(ls[x],val[x]+1);
val[x]=val[z]; col[x]=col[z];
}
return y;
}
else
{
if(b<val[x]) return delt(ls[x],b);
else return delt(rs[x],b);
}
}
int getmin(int x)
{
int i;
for(i=x;ls[i];i=ls[i]);
return i;
}
int getmax(int x)
{
int i;
for(i=x;rs[i];i=rs[i]);
return i;
}
void sbt()
{
int op,a,b,f;
for(;scanf("%d",&op)&&op;)
{
if(op==1)
{
a=getint();
b=getint();
insert(root,b,a);
}
if(op==3)
{
f=getmin(root);
printf("%d\n",col[f]);
if(f) delt(root,val[f]);
}
if(op==2)
{
f=getmax(root);
printf("%d\n",col[f]);
if(f) delt(root,val[f]);
}
}
}
int main()
{
sbt();
return 0;
}