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 <stdio.h>
#include <stdlib.h>
#define MAX 1000000


struct queue{
    char name[10];
    int time;
};

void initialize();
int isFull();
int isEmpty();
void enqueue(struct queue);
struct queue dequeue();

int head;
int tail;

struct queue A[MAX];
struct queue Q[MAX];

int main(){
    int n,q;
    int total = 0;
    int flag = 1;
    struct queue x;

    scanf("%d %d",&n,&q);

    initialize();

    for(int i = 0;i < n;i++){
        scanf("%s %d",A[i].name,&A[i].time);
        enqueue(A[i]);
    }

    while(flag){
        x = dequeue();
        
        if(x.time - q > 0){
            total += q;
            x.time = x.time - q;
            enqueue(x);
        }
        else if(x.time - q == 0){
            total += q;
            printf("%s %d\n",x.name,total);
        }
        else{
            total += x.time;
            printf("%s %d\n",x.name,total);
        }

        flag = isEmpty() - 1;
    }

    return 0;
}

void initialize(){
    head = 0;
    tail = 0;
}

int isEmpty(){
    if(head == tail)return 1;
    return 0;
}

int isFull(){
    if(head == (tail+1) % MAX)return 1;
    return 0;
}

void enqueue(struct queue x){
    if(isFull()){
        fprintf(stderr,"OverFlow");
        exit(1);
    }
    Q[tail] = x;
    if(tail + 1 == MAX)tail = 0; 
    else tail++;
}

struct queue dequeue(){
    struct queue x;
    if(isEmpty()){
        fprintf(stderr,"AnderFlow");
        exit(1);
    }
    x = Q[head];
    if(head + 1 == MAX)head = 0;
    else head++;
    return x;
}