分块+hash
int block[101]={0};
int hashtable[100001]={0};
#include<bits/stdc++.h>
using namespace std;
stack<int> s;
int block[101]={0};
int hashtable[100001]={0};
int getmid(){
int k,sum=0,num=0,now;
if(s.size()%2==0)
k=s.size()/2;
else
k=(s.size()+1)/2;
while(sum+block[num]<k){
sum+=block[num];
num++;
}
now=1000*num;
while(sum+hashtable[now]<k)
{
sum+=hashtable[now];
now++;
}
return now;
}
void pop(){
int temp=s.top();
s.pop();
cout<<temp<<endl;
hashtable[temp]--;
block[temp/1000]--;
}
void push(int num){
s.push(num);
hashtable[num]++;
block[num/1000]++;
}
int main(){
int n,number;
cin>>n;
for(int i=0;i<n;i++){
char c[20];
cin>>c;
if(strcmp(c,"Pop")==0)
{
if(s.size()==0)
cout<<"Invalid"<<endl;
else
pop();
}
if(strcmp(c,"Push")==0){
cin>>number;
push(number);
}
if(strcmp(c,"PeekMedian")==0){
if(s.size()==0)
cout<<"Invalid"<<endl;
else{
int mid=getmid();
cout<<mid<<endl;
}
}
}
return 0;
}