-
Notifications
You must be signed in to change notification settings - Fork 0
/
1057.cpp
104 lines (96 loc) · 1.56 KB
/
1057.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* 参照了网上的答案,采取“树状数组+二分查找”的方法*/
/* 1057. Stack (30)五种解法总结(大杂烩) http://blog.csdn.net/sinat_29278271/article/details/47291659 */
#include <cstdio>
#include <stack>
using namespace std;
const int MAXNUM = 100005;
stack<int> nStack;
int ninput[MAXNUM] = {0};
int lowbit(int key)
{
return key&(-key);
}
/* opt = 1, 将key放入数组
opt = -1, 将key移出数组*/
void update(int *narray, int key, int opt)
{
while (key < MAXNUM)
{
narray[key] += opt;
key += lowbit(key);
}
}
int getSum(int *narray, int key)
{
int sum = 0;
while (key > 0)
{
sum += narray[key];
key -= lowbit(key);
}
return sum;
}
int findMid(int *narray, int value)
{
int low = 0;
int high = MAXNUM;
int mid, temp;
/* 退出循环的唯一条件是low > high (或者说此时low == high+1)*/
while (low <= high)
{
mid = (low+high)/2;
temp = getSum(narray, mid);
if (temp >= value)
{
high = mid-1;
}
else
{
low = mid+1;
}
}
return low;
}
int main()
{
char buffer[20];
int N, temp;
scanf("%d", &N);
for (int i = 0; i != N; ++i)
{
scanf("%s", buffer);
switch (buffer[1])
{
case 'u':
scanf("%d", &temp);
nStack.push(temp);
update(ninput, temp, 1);
break;
case 'o':
if (nStack.empty())
{
printf("Invalid\n");
}
else
{
temp = nStack.top();
printf("%d\n", temp);
update(ninput, temp, -1);
nStack.pop();
}
break;
case 'e':
if (nStack.empty())
{
printf("Invalid\n");
}
else
{
temp = findMid(ninput, (nStack.size()+1)/2);
printf("%d\n", temp);
}
break;
}
}
return 0;
}