Problem:
Doubly Linked List

Your task is to implement a double linked list.

Write a program which performs the following operations:

insert x: insert an element with key x into the front of the list.

delete x: delete the first element which has the key of x from the list. If there is not such element, you need not do anything.

deleteFirst: delete the first element from the list.

deleteLast: delete the last element from the list.

Input

The input is given in the following format:

n

command1

command2

...

commandn

In the first line, the number of operations n is given. In the following n lines, the above mentioned operations are given in the following format:

insert x

delete x

deleteFirst

deleteLast

Output

Print all the element (key) in the list after the given operations. Two consequtive keys should be separated by a single space.

Constraints

The number of operations ≤ 2,000,000

The number of delete operations ≤ 20

0 ≤ value of a key ≤ 109

The number of elements in the list does not exceed 106

For a delete, deleteFirst or deleteLast operation, there is at least one element in the list.

Sample Input 1

7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5

Sample Output 1

6 1 2

Sample Input 2

9
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
deleteFirst
deleteLast

Sample Output 2

1

Solution in C (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define VALUES_PER_UNIT	0xFF
#define VOID_VAL	(-1)


typedef struct unit {
	struct unit *before, *after;
	int values[VALUES_PER_UNIT];
} unit;

int main(void) {
	char s[20];
	int index = 0, i, j, n, val;
	FILE *fp = fopen("ALDS1_3_C_in9.txt", "rb");
	unit *funit, *lunit, *u;
	funit = malloc(sizeof(unit));
	funit->before = funit->after = NULL;
	lunit = funit;
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		//if (i % 10000 == 0 || i >= 2000000) fprintf(stderr, "%d\n", i);
		scanf("%s", s);
		if (strcmp(s, "insert") == 0) {
			scanf("%d", &val);
			lunit->values[index++] = val;
			if (index >= VALUES_PER_UNIT) {
				u = malloc(sizeof(unit));
				lunit->after = u;
				u->before = lunit;
				u->after = NULL;
				lunit = u;
				index = 0;
			}
		} else if (strcmp(s, "delete") == 0) {
			scanf("%d", &val);
			j = index;
			u = lunit;
			while (u != NULL) {
				while (--j >= 0) {
					if (u->values[j] == val) {
						u->values[j] = VOID_VAL;
						break;
					}
				}
				if (j >= 0) break;
				u = u->before;
				j = VALUES_PER_UNIT;
			}
		} else if(strcmp(s, "deleteFirst") == 0) {

			do {
				index--;
				if (index < 0) {
					if (lunit->before == NULL) break;
					u = lunit;
					lunit = lunit->before;
					free(u);
					index = VALUES_PER_UNIT - 1;
				}
			} while (lunit->values[index] == VOID_VAL);
		} else if(strcmp(s, "deleteLast") == 0) {
			j = 0;
			while (funit->values[j] == VOID_VAL) {
				if (++j >= VALUES_PER_UNIT) {
					if (funit->after == NULL) break;
					u = funit;
					funit = funit->after;
					funit->before = NULL;
					free(u);
					j = 0;
				}
			}
			if (j < VALUES_PER_UNIT) {
				funit->values[j] = VOID_VAL;
			}
		} else printf("invalid operation: %s\n", s);
	}
	i = 0;
	for (u = lunit; u != NULL; u = u->before) {
		while (--index >= 0) {
			if (u->values[index] != VOID_VAL) {
				if (i) {
					printf(" ");
				} else i++;
				printf("%d", u->values[index]);
			}
		}
		index = VALUES_PER_UNIT - 1;
	}
	printf("\n");
}