#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define main dummy_main
int main(){
return 0;
}
#undef main
int ast;
int aed;
int a[3000];
int bst;
int bed;
int b[3000];
class FrontMiddleBackQueue{
public:
FrontMiddleBackQueue(){
ast = aed = bst = bed = 1500;
}
void doit(void){
int i;
while(aed - ast > bed - bst){
i = a[--aed];
b[--bst] = i;
}
while(aed - ast < bed - bst - 1){
i = b[bst++];
a[aed++] = i;
}
}
void pushFront(int val){
a[--ast] = val;
}
void pushMiddle(int val){
doit();
a[aed++] = val;
}
void pushBack(int val){
b[bed++] = val;
}
int popFront(){
if(aed - ast > 0){
return a[ast++];
}
if(bed - bst > 0){
return b[bst++];
}
return -1;
}
int popMiddle(){
doit();
if(aed - ast == bed - bst && bed - bst == 0){
return -1;
}
if(aed - ast == bed - bst){
return a[--aed];
}
return b[bst++];
}
int popBack(){
if(bed - bst > 0){
return b[--bed];
}
if(aed - ast > 0){
return a[--aed];
}
return -1;
}
}
;
// cLay version 20201206-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int ast, aed, a[3000], bst, bed, b[3000];
//
// class FrontMiddleBackQueue {
// public:
// FrontMiddleBackQueue() {
// ast = aed = bst = bed = 1500;
// }
//
// void doit(void){
// int i;
// while(aed - ast > bed - bst){
// i = a[--aed];
// b[--bst] = i;
// }
// while(aed - ast < bed - bst - 1){
// i = b[bst++];
// a[aed++] = i;
// }
// }
//
// void pushFront(int val) {
// a[--ast] = val;
// }
// void pushMiddle(int val) {
// doit();
// a[aed++] = val;
// }
// void pushBack(int val) {
// b[bed++] = val;
// }
//
// int popFront() {
// if(aed - ast > 0) return a[ast++];
// if(bed - bst > 0) return b[bst++];
// return -1;
// }
// int popMiddle() {
// doit();
// if(aed - ast == bed - bst == 0) return -1;
// if(aed - ast == bed - bst) return a[--aed];
// return b[bst++];
// }
// int popBack() {
// if(bed - bst > 0) return b[--bed];
// if(aed - ast > 0) return a[--aed];
// return -1;
// }
// };