#pragma once
#include<queue>
#include<type_traits>usingnamespacestd;template<typenameT,boolMinimize=true>structErasablePriorityQueue{usingQueue=conditional_t<Minimize,priority_queue<T,vector<T>,greater<T>>,priority_queue<T>>;QueueQ,Q2;ErasablePriorityQueue()=default;voidpush(constT&t){Q.push(t);}Ttop(){normalize();assert(!Q.empty());returnQ.top();}voidpop(){normalize();assert(!Q.empty());Q.pop();}voiderase(constT&t){Q2.push(t);}private:voidnormalize(){while(!Q.empty()and!Q2.empty()andQ.top()==Q2.top()){Q.pop(),Q2.pop();}}};