#include <stdio.h>
#include <string.h>
#define MaxSize 100000

//定义顺序栈
struct SqStack{
    int top;
    int data[MaxSize];
};

//初始化栈
void InitStack(struct SqStack *S){
    S->top = -1;
}

//判断栈是否为空
int StackEmpty(struct SqStack S){
    if(S.top == -1){
        return 1;
    }
    else{
        return 0;
    }
}

//入栈
int Push(struct SqStack *S, int x){
    if(S->top == MaxSize - 1){
       return 0;
    }
    S->top ++;
    S->data[S->top] = x;
    return 1;
}

//出栈
int Pop(struct SqStack *S, int *x){
    if(S->top == -1){
       return 0;
    }
    *x = S->data[S->top];
    S->top --;
    return 1;
}

//读栈顶元素
int Query(struct SqStack *S, int *x){
    if(S->top == -1){
        return 0;
    }
    *x = S->data[S->top];
    return 1;
}

//返回栈中元素数量
int size(struct SqStack *S){
    return S->top + 1;
}


int main() {
    struct SqStack MyStack;
    InitStack(&MyStack);
    int n;
    scanf("%d",&n);

    //for循环读取每一条指令
    for(int i = 0; i < n; i ++){
        char s[20] = "";
        scanf("%s",s);//扫描每一行的第一个字符串

        //匹配指令并执行操作
        if(!strcmp(s,"push")){
            int x;
            scanf("%d",&x);
            Push(&MyStack, x);
        }
        if(!strcmp(s,"pop")){
            int pop_x;
            int r = Pop(&MyStack, &pop_x);
            if(!r){
                printf("Empty\n");
            }
        }
        if(!strcmp(s,"query")){
            int x;
            int r = Query(&MyStack, &x);
            if(!r){
                printf("Empty\n");
            }
            else{
                printf("%d\n",x);
            }
        }
        if(!strcmp(s,"size")){
            printf("%d\n",size(&MyStack));
        }
    }

    return 0;
}