1057. Stack (30)

#include <iostream>
#include <stack>

using namespace std;

int c[100010];

int lowbit(int x)
{
	return x & (-x);
}

int getsum(int x)
{
	int sum = 0;
	while(x > 0)
	{
		sum += c[x];
		x -= lowbit(x);
	}

	return sum;
}

void update(int x, int val)
{
	while(x <= 100000)
	{
		c[x] += val;
		x += lowbit(x);
	}
}

int getnum(int low, int high, int goal)
{
	int mid, sum;
	while(low < high)
	{
		mid = (low + high) / 2;
		sum = getsum(mid);

		if(sum >= goal)
		{
			high = mid;
		}
		else
		{
			low = mid + 1;
		}
	}

	return high;
}

int main()
{
	int n;
	scanf("%d", &n);

	int i, flag, num, size, index;
	char s[20], ch;
	stack<int> st;

	for(i = 1; i <= n; i++)
	{
		getchar();
		scanf("%s", s);

		ch = s[1];
		if(ch == 'u')
		{
			scanf("%d", &num);

			flag = -1;
			st.push(num);
			update(num, 1);
		}
		else if(ch == 'o')
		{
			size = st.size();
			if(size > 0)
			{
				flag = 1;
				num = st.top();
				st.pop();
				update(num, -1);
			}
			else
			{
				flag = 0;
			}
		}
		else
		{
			size = st.size();
			if(size > 0)
			{
				flag = 1;

				if(size % 2 == 0)
				{
					index = size / 2;
				}
				else
				{
					index = (size + 1) / 2;
				}

				num = getnum(1, 100000, index);
			}
			else
			{
				flag = 0;
			}
		}

		if(flag == 0)
		{
			printf("Invalid\n");
		}
		else if(flag == 1)
		{
			printf("%d\n", num);
		}
	}

	system("pause");
	return 0;
}

 

posted on 2025-11-23 17:10  王景迁  阅读(3)  评论(0)    收藏  举报

导航