#include <stdio.h>
#include <assert.h>
#define MAXSIZE 200000
typedef struct Queue {
int data[MAXSIZE];
int front, back, length;
}Queue;
int push_front(Queue* q, int data) {
assert(q);
if (q->length >= MAXSIZE) {
return 0;
}
if (q->front == 0 && q->back == 0 && q->length == 0) {
q->data[q->front] = data;
q->length++;
}
else {
q->front = (q->front + MAXSIZE - 1) % MAXSIZE;
q->data[q->front] = data;
q->length++;
}
return 1;
}
int push_back(Queue* q, int data) {
assert(q);
if (q->length == MAXSIZE) {
return 0;
}
if (q->front == 0 && q->back == 0 && q->length == 0) {
q->data[q->back] = data;
q->length++;
}
else {
q->back = (q->back + 1) % MAXSIZE;
q->data[q->back] = data;
q->length++;
}
return 1;
}
int pop_front(Queue* q) {
assert(q);
int data = q->data[q->front];
q->front = (q->front + 1) % MAXSIZE;
q->length--;
return data;
}
int pop_back(Queue* q) {
assert(q);
int data = q->data[q->back];
q->back = (q->back + MAXSIZE - 1) % MAXSIZE;
q->length--;
return data;
}
int main() {
int q = 0;
scanf("%d", &q);
int operate = 0;
int data = 0;
Queue queue;
queue.front = 0;
queue.back = 0;
queue.length = 0;
while (q--) {
scanf("%d", &operate);
switch (operate) {
case 1:
scanf("%d", &data);
push_front(&queue, data);
break;
case 2:
scanf("%d", &data);
push_back(&queue, data);
break;
case 3:
if (queue.length > 0) {
printf("%d\n", pop_front(&queue));
}
else {
printf("no data\n");
}
break;
case 4:
if (queue.length > 0) {
printf("%d\n", pop_back(&queue));
}
else {
printf("no data\n");
}
break;
}
}
return 0;
}