#include<stdio.h>
#include<time.h>
#define NMAX 100001
int left[NMAX],right[NMAX],size[NMAX],weight[NMAX],priority[NMAX],root,m=1;
void update_size(int p)
{
p[size]=p[left][size]+p[right][size]+1;
}
void split_weight(int now,int w,int *x,int *y)
{
if(now==0)
{
*x=*y=0;
return;
}
if(now[weight]<=w)
{
*x=now;
split_weight(now[right],w,now+right,y);
}
else
{
*y=now;
split_weight(now[left],w,x,now+left);
}
update_size(now);
}
void split_rank(int now,int rank,int *x,int *y)
{
if(now==0)
{
*x=*y=0;
return;
}
if(now[size]<=rank)
{
*x=now;
split_weight(now[right],rank-now[size]-1,now+right,y);
}
else
{
*y=now;
split_weight(now[left],rank,x,now+left);
}
update_size(now);
}
int merge(int x,int y)
{
if(x==0||y==0)
{
return (x?y==0:y);
}
if(x[priority]<y[priority])
{
x[right]=merge(x[right],y);
update_size(x);
return x;
}
else
{
y[left]=merge(x,y[left]);
update_size(y);
return y;
}
}
int max(int p)
{
if(p[right]!=0)
{
return max(p[right]);
}
return p[weight];
}
int min(int p)
{
if(p[left]!=0)
{
return max(p[left]);
}
return p[weight];
}
void solve1(int t)
{
int x,y,z;
m[left]=0;
m[right]=0;
m[size]=1;
m[weight]=t;
m[priority]=rand();
split_weight(root,t,&x,&y);
root=merge(merge(x,m),y);
m++;
}
void solve2(int t)
{
int x,y,z;
split_weight(root,t,&x,&z);
split_weight(x,t-1,&x,&y);
root=merge(merge(x,merge(y[left],y[right])),z);
}
void solve3(int t)
{
int x,y,z;
split_weight(root,t,&x,&y);
printf("%d\n",x[size]+1);
merge(x,y);
}
void solve4(int t)
{
int x,y,z;
split_rank(root,t,&x,&y);
printf("%d\n",max(x));
merge(x,y);
}
void solve5(int t)
{
int x,y,z;
split_weight(root,t-1,&x,&y);
printf("%d\n",max(x));
merge(x,y);
}
void solve6(int t)
{
int x,y,z;
split_weight(root,t,&x,&y);
printf("%d\n",min(y));
merge(x,y);
}
int main()
{
int n,i,r,t;
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%d%d",&r,&t);
switch(r)
{
case 1:
solve1(t);
break;
case 2:
solve2(t);
break;
case 3:
solve3(t);
break;
case 4:
solve4(t);
break;
case 5:
solve5(t);
break;
case 6:
solve6(t);
break;
};
}
return 0;
}
寄录