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++14 (judge verdict: Accepted)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <queue>
#include <deque>
#include <bitset>
#include <iterator>
#include <list>
#include <stack>
#include <map>
#include <unordered_map>
#include <set>
#include <functional>
#include <numeric>
#include <utility>
#include <limits>
#include <time.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
using namespace std ;
#define endl '\n' 
 
struct HASH{
  size_t operator()(const pair<int,int>&x)const{
    return hash<long long>()(((long long)x.first)^(((long long)x.second)<<32));
  }
};
unordered_map<pair<int,int>,int,HASH>mp;
 
#ifdef _DEBUG
//	freopen("input.txt", "r", stdin);
//	freopen("output.txt", "w", stdout);
#endif 

list < int > l ;

void showList(list <int> g) 
{ 
	int cnt = 0 ;
    list <int> :: iterator i ;  
    for(i = g.begin(); i != g.end(); ++i) { 
		if(i == g.begin()) cout << *i ;
		else cout << ' ' << *i ; 
    }
    cout << endl ;
} 

int main() 
{ 
	int T , n ;
	string s ;
	cin >> T ;
	
	while(T--){ 
		cin >> s ;
		if(s == "insert"){
			cin >> n ;
			l.push_front(n) ;
		}
		
		else if(s == "delete"){
			cin >> n ;
			list <int> :: iterator j ; 
			for(j = l.begin() ; j != l.end() ; j++){
				if(*j == n){
					l.erase(j) ;
					break ;
				}
			}
		}
			
		else if(s == "deleteFirst") l.pop_front() ;
		else l.pop_back() ;
	}
	
	showList(l) ;
	return 0 ;
}