#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;
}