<img src="https://img-blog.csdn.net/20140327112108859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3JlYXQyMDEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="middle" />
//树状数组
#include<stdio.h>
const int maxn=100010;
int n;
int s[maxn];
int num=0;
char str[20];
int tree_array[maxn];
int lowbit(int x)
{
return x&(-x);//tree_array[x]所管辖的区域长度,以及到上一个父节点的距离
}
void add(int pos,int val)//改变pos值
{
while(pos<maxn)
{
tree_array[pos]+=val;
pos+=lowbit(pos);
}
}
int sum(int pos)//从tree_array[1]到tree_array[pos]的总和
{
int ans=0;
while(pos>0)
{
ans+=tree_array[pos];
pos-=lowbit(pos);
}
return ans;
}
int find_x(int x)//寻找第x值所在的位置
{
int low=1;
int high=maxn-1;
while(low<high)
{
int mid=(low+high)/2;
if(x>sum(mid))
low=mid+1;
else
high=mid;
}
return low;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",str);
if(str[1]=='o')
{
if(num>0)
{
num--;
int x=s[num];
add(x,-1);
printf("%d\n",x);
}
else
printf("Invalid\n");
}else if(str[1]=='e')
{
if(num>0)
{
int id=num/2+(num%2==0?0:1);
int x=find_x(id);
printf("%d\n",x);
}else
printf("Invalid\n");
}else if(str[1]=='u')
{
int x;
scanf("%d",&x);
s[num++]=x;
add(x,1);
}
}
return 0;
}
PAT1057
最新推荐文章于 2023-01-29 15:23:30 发布