#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
int data;
Node * next;
Node * prev;
Node(int dataValue)
{
data = dataValue;
next = NULL;
prev = NULL;
}
};
class DLL
{
public :
Node * tail;
Node * front;
DLL()
{
tail=NULL;
front = NULL;
}
Node * insertNode(int data)
{
Node* n = new Node(data);
if(front==NULL)
{
front = tail = n;
}
else
{
Node * prevNode = tail;
tail->next = n;
tail = tail->next;
tail->prev = prevNode;
}
return n;
}
void removeNode (Node * node)
{
if(node ==NULL)
return;
if(node->prev==NULL && node->next ==NULL)
{
front = tail =NULL;
delete(node);
}
else if(node->prev==NULL)
{
front = front->next;
front-> prev = NULL;
delete(node);
}
else if(node->next==NULL)
{
tail = node->prev;
tail->next = NULL;
delete(node);
}
else
{
Node * prevNode = node-> prev;
Node * nextNode = node-> next;
prevNode->next = nextNode;
nextNode->prev =prevNode;
delete(node);
}
}
};
class VisitorService
{
public :
DLL list;
unordered_map<int,Node *> nodeLocationOneTime;
unordered_set<int> alreadyVisitedOnes;
void postVisitor(int x)
{
if(alreadyVisitedOnes.count(x))
return;
if(nodeLocationOneTime.count(x))
{
Node * nodeLoc = nodeLocationOneTime[x];
list.removeNode(nodeLoc);
nodeLocationOneTime.erase(x);
alreadyVisitedOnes.insert(x);
}
else
{
Node * newNode = list.insertNode(x);
nodeLocationOneTime[x]=newNode;
}
}
int firstTimeVisitor()
{
if(list.front!=NULL)
{
return list.front->data;
}
else
return -1;
}
};
int main() {
// your code goes here
VisitorService vs;
vs.postVisitor(2);
vs.postVisitor(3);
vs.postVisitor(2);
vs.postVisitor(5);
vs.postVisitor(2);
vs.postVisitor(3);
vs.postVisitor(5);
cout<<"First visitor is :"<<vs.firstTimeVisitor();
return 0;
}