<!-- lang: cpp -->
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
struct Node
{
char str_command[300];
int parameter;
int priority;
int index;
bool operator < (const Node& a) const;
bool operator > (const Node& a) const;
};
inline bool Node::operator < (const Node& a) const
{
if(priority != a.priority)
return priority<a.priority;
else
return index<a.index;
}
inline bool Node::operator > (const Node& a) const
{
if(priority != a.priority)
return priority>a.priority;
else
return index>a.index;
}
class Heap
{
public:
Heap(){size=0;}
void push(const Node& value);
Node top(){return _heap[1];}
Node pop();
bool isEmpty(){return size==0;}
private:
Node _heap[60101];
int size;
void heapify_down(const int& pos);
void heapify_up(const int& pos);
};
inline void Heap::push(const Node& value)
{
_heap[++size]=value;
heapify_up(size);
}
inline Node Heap::pop()
{
Node ret=_heap[1];
_heap[1]=_heap[size--];
heapify_down(1);
return ret;
}
inline void Heap::heapify_down(const int& pos)
{
for(int i=pos;(i<<1)<=size;)
{
int s=i<<1,r=(i<<1)+1;
if(r<=size && _heap[r]<_heap[s])
s=r;
if(_heap[i]>_heap[s])
{
swap(_heap[i],_heap[s]);
i=s;
}
else
break;
}
}
inline void Heap::heapify_up(const int& pos)
{
for(int i=pos;i>1;)
{
int s=i>>1;
if(_heap[i]<_heap[s])
{
swap(_heap[i],_heap[s]);
i=s;
}
else
break;
}
}
Heap heap;
int main()
{
char buf[300];
int index=0;
while(cin>>buf)
{
if(strcmp("GET",buf)==0)
{
if(heap.isEmpty())
cout<<"EMPTY QUEUE!"<<endl;
else
{
Node output=heap.pop();
cout<<output.str_command<<' '<<output.parameter<<endl;
}
}
else
{
index++;
int par,pri;
cin>>buf>>par>>pri;
Node in;
strcpy(in.str_command,buf);
in.parameter=par;
in.priority=pri;
in.index=index;
heap.push(in);
}
}
return 0;
}