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>

int num[2000002];
int firstNum=0;
int lastNum=0;

void insert(int);
void delete(int,int);
int findNum(int,int);

void deleteFirst(int);
void deleteLast(int,int);

int main(){
  int i,j;
  int n,cnt=0;
  char order[15];


  scanf("%d",&n);

  while(i!=n) num[i++]=-1;

  for(i=0;i<n;i++){
    scanf("%s",order);
    if(strcmp("insert",order)==0){
      scanf("%d",&j);
      insert(j);
    }

    if(strcmp("delete",order)==0){
      scanf("%d",&j);
      delete(j,n);
    }
    if(strcmp("deleteFirst",order)==0){
      deleteFirst(firstNum);
    }
    if(strcmp("deleteLast",order)==0){
      deleteLast(lastNum,n);
    }
  }

  for(i=n-1;i>=0;i--){
    if(num[i]==-1) continue;
    else if(num[i]!=-1 && cnt!=0) printf(" ");
    
    printf("%d",num[i]);
    cnt++;
    }
  printf("\n");
  return 0;
}

void insert(int n){
  static int i=0;
  
  num[i]=n;
  if(firstNum<i) firstNum=i;
  i++;
}

void delete(int n,int v){
  int m;
  int i;
  m=findNum(n,v);
  if(m==-1) return;
  num[m]=-1;
  if(m==firstNum){
    i=firstNum;
    while(i>=0){
      if(num[i]!=-1){
        firstNum=i;
        break;
	}
      i--;
    }
  }

  if(m==lastNum){
    i=lastNum;
    while(i<n){
      if(num[i]!=-1){
        lastNum=i;
        break;
      }
    i++;
    }
  }
}

int findNum(int m,int n){
  int i=n;
  while(i>=0){
    if(num[i]==m) return i;
    i--;
  }
  if(i==n) return -1;
}  

void deleteFirst(int n){
  int i=n-1;
  num[n]=-1;
  while(i>=0){
    if(num[i]!=-1){
     firstNum=i;
     break;
    }
   i--;
  } 
  if(i==n) firstNum=n;
}
void deleteLast(int n,int m){
  int i=n;
  num[n]=-1;
  while(i<m){
    if(num[i]!=-1){
      lastNum=i;
      break;
      }
    i++;
  }
}