classExamRoom{public:ExamRoom(intN):N(N){}intseat(){if(students.empty()){students.push_back(0);map[0]=begin(students);return0;}intprevStudent=-1;intmaxDistToClosest=0;intval=0;// Inserted vallist<int>::iteratorpos;// Inserted positionfor(autoit=begin(students);it!=end(students);++it){if(prevStudent==-1){// doesn't insert beforemaxDistToClosest=*it;// Distance between it and the beginingpos=it;}elseif((*it-prevStudent)/2>maxDistToClosest){maxDistToClosest=(*it-prevStudent)/2;val=(*it+prevStudent)/2;pos=it;}prevStudent=*it;}if(N-1-students.back()>maxDistToClosest){pos=end(students);val=N-1;}map[val]=students.insert(pos,val);returnval;}voidleave(intp){students.erase(map[p]);}private:intN;list<int>students;unordered_map<int,list<int>::iterator>map;// {p: student iterator}};
classNode{publicNodeprev;publicNodenext;publicintvalue;publicNode(intvalue){this.value=value;}}classExamRoom{publicExamRoom(intN){this.N=N;join(head,tail);}publicintseat(){if(head.next==tail){Nodenode=newNode(0);join(head,node);join(node,tail);map.put(0,node);return0;}intprevStudent=-1;intmaxDistToClosest=0;intval=0;// Inserted valNodepos=null;// Inserted positionfor(Nodenode=head;node!=tail;node=node.next){if(prevStudent==-1){// doesn't insert beforemaxDistToClosest=node.value;// Distance between it and the beginingpos=node;}elseif((node.value-prevStudent)/2>maxDistToClosest){maxDistToClosest=(node.value-prevStudent)/2;val=(node.value+prevStudent)/2;pos=node;}prevStudent=node.value;}if(N-1-tail.prev.value>maxDistToClosest){pos=tail;val=N-1;}NodeinsertedNode=newNode(val);join(pos.prev,insertedNode);join(insertedNode,pos);map.put(val,insertedNode);returnval;}publicvoidleave(intp){NoderemovedNode=map.get(p);join(removedNode.prev,removedNode.next);}privateintN;privateNodehead=newNode(-1);privateNodetail=newNode(-1);privateMap<Integer,Node>map=newHashMap<>();// {p: student iterator}privatevoidjoin(Nodenode1,Nodenode2){node1.next=node2;node2.prev=node1;}privatevoidremove(Nodenode){join(node.prev,node.next);}}