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: Time Limit Exceeded)

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
struct node{
	int x;
	node* pre;
	node* next;
};
void init(node *x) {
	x->pre = x->next = NULL;
}
void Insert(node* head,int x) {
	node *n = new node;
	init(n);
	n->x = x;
	if (head->next == NULL) {
		n->pre = head;
		head->next = n;
	}
	else {
		node* nn = new node;
		nn = head->next;
		n->pre = head;
		head->next = n;
		n->next = nn;
		nn->pre = n;
	}
}
int DeleteFirst(node* head) {
	if (head->next == NULL)
		return 0;
	else {
		head->next = head->next->next;
	}
	return 1;
}
int Delete(node* head, int x) {
	node* n = new node;
	n = head->next;
	if (n->x == x) {
		DeleteFirst(head);
		return 0;
	}
	for (; n->next != NULL; n = n->next) {
		if (n->x == x) {
			n->pre->next = n->next;
			n->next->pre = n->pre;
			delete n;
			return 0;
		}
	}
	if (n->x == x) {
		n->pre->next = NULL;
		delete n;
		return 0;
	}
	return 1;
}

int DeleteLast(node* head) {
	node* n = new node;
	n = head->next;
	if (n->next == NULL) {
		head->next = NULL;
		return 0;
	}
	while (n->next != NULL) {
		n = n->next;
	}
	n->pre->next = NULL;
	delete n;
	return 1;
}
int Print(node *head) {
	if (head->next == NULL) {
		cout << endl;
		return 0;
	}
	node *n = new node;
	n = head->next;
	node *pre = new node;
	pre = n;
	while (n->next != NULL) {
		cout << n->x << " ";
		n = n->next;
		pre = n;
	}
	cout << pre->x << endl;
	return 1;
}
int main() {
	node* head=new node;
	init(head);
	char s[30];
	int x,a;
	cin >> x;
	for (int i = 0; i < x; i++) {
		//cin >> s;
		scanf("%s", s);
		//cout << "s:" << s << endl;
		if (s[0] == 'i'&&s[2]=='s') {
			//cin >> a;
			scanf("%d", &a);
		//	cout << "a:" << a << endl;
			Insert(head, a);
			//cout << "insert:" << a << endl;
		}
		else if (s[0] == 'd'&&s[6]=='L') {
			DeleteLast(head);
			//cout << "deleteLast" << endl;
		}
		else if (s[0] == 'd'&&s[6] == 'F'){
			DeleteFirst(head);
			//cout << "deleteFirst" << endl;
		}
		else {
			cin >> a;
			Delete(head, a);
			//cout << "delete" << a << endl;
		}
		//Print(head);
	}
	Print(head);
	/*char s[30];
	scanf("%s", s);
	cout << s << endl;
	return 0;*/
}