5 solutions

  • 1
    @ 2026-4-7 18:15:40
    // Queue implementation -*- C++ -*-
    
    // Copyright (C) 2001-2013 Free Software Foundation, Inc.
    //
    // This file is part of the GNU ISO C++ Library.  This library is free
    // software; you can redistribute it and/or modify it under the
    // terms of the GNU General Public License as published by the
    // Free Software Foundation; either version 3, or (at your option)
    // any later version.
    
    // This library is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU General Public License for more details.
    
    // Under Section 7 of GPL version 3, you are granted additional
    // permissions described in the GCC Runtime Library Exception, version
    // 3.1, as published by the Free Software Foundation.
    
    // You should have received a copy of the GNU General Public License and
    // a copy of the GCC Runtime Library Exception along with this program;
    // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    // <http://www.gnu.org/licenses/>.
    
    /*
     *
     * Copyright (c) 1994
     * Hewlett-Packard Company
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Hewlett-Packard Company makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     *
     *
     * Copyright (c) 1996,1997
     * Silicon Graphics Computer Systems, Inc.
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Silicon Graphics makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     */
    
    /** @file bits/stl_queue.h
     *  This is an internal header file, included by other library headers.
     *  Do not attempt to use it directly. @headername{queue}
     */
    
    #ifndef _STL_QUEUE_H
    #define _STL_QUEUE_H 1
    
    #include <bits/concept_check.h>
    #include <debug/debug.h>
    
    namespace std _GLIBCXX_VISIBILITY(default)
    {
    _GLIBCXX_BEGIN_NAMESPACE_VERSION
    
      /**
       *  @brief  A standard container giving FIFO behavior.
       *
       *  @ingroup sequences
       *
       *  @tparam _Tp  Type of element.
       *  @tparam _Sequence  Type of underlying sequence, defaults to deque<_Tp>.
       *
       *  Meets many of the requirements of a
       *  <a href="tables.html#65">container</a>,
       *  but does not define anything to do with iterators.  Very few of the
       *  other standard container interfaces are defined.
       *
       *  This is not a true container, but an @e adaptor.  It holds another
       *  container, and provides a wrapper interface to that container.  The
       *  wrapper is what enforces strict first-in-first-out %queue behavior.
       *
       *  The second template parameter defines the type of the underlying
       *  sequence/container.  It defaults to std::deque, but it can be any type
       *  that supports @c front, @c back, @c push_back, and @c pop_front,
       *  such as std::list or an appropriate user-defined type.
       *
       *  Members not found in @a normal containers are @c container_type,
       *  which is a typedef for the second Sequence parameter, and @c push and
       *  @c pop, which are standard %queue/FIFO operations.
      */
      template<typename _Tp, typename _Sequence = deque<_Tp> >
        class queue
        {
          // concept requirements
          typedef typename _Sequence::value_type _Sequence_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
          __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
          __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
    
          template<typename _Tp1, typename _Seq1>
            friend bool
            operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
    
          template<typename _Tp1, typename _Seq1>
            friend bool
            operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
    
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
    
        protected:
          /**
           *  'c' is the underlying container.  Maintainers wondering why
           *  this isn't uglified as per style guidelines should note that
           *  this name is specified in the standard, [23.2.3.1].  (Why?
           *  Presumably for the same reason that it's protected instead
           *  of private: to allow derivation.  But none of the other
           *  containers allow for derivation.  Odd.)
           */
          _Sequence c;
    
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
    #if __cplusplus < 201103L
          explicit
          queue(const _Sequence& __c = _Sequence())
          : c(__c) { }
    #else
          explicit
          queue(const _Sequence& __c)
          : c(__c) { }
    
          explicit
          queue(_Sequence&& __c = _Sequence())
          : c(std::move(__c)) { }
    #endif
    
          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
    
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
    
          /**
           *  Returns a read/write reference to the data at the first
           *  element of the %queue.
           */
          reference
          front()
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          front() const
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  Returns a read/write reference to the data at the last
           *  element of the %queue.
           */
          reference
          back()
          {
    	__glibcxx_requires_nonempty();
    	return c.back();
          }
    
          /**
           *  Returns a read-only (constant) reference to the data at the last
           *  element of the %queue.
           */
          const_reference
          back() const
          {
    	__glibcxx_requires_nonempty();
    	return c.back();
          }
    
          /**
           *  @brief  Add data to the end of the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.  The function creates an
           *  element at the end of the %queue and assigns the given data
           *  to it.  The time complexity of the operation depends on the
           *  underlying sequence.
           */
          void
          push(const value_type& __x)
          { c.push_back(__x); }
    
    #if __cplusplus >= 201103L
          void
          push(value_type&& __x)
          { c.push_back(std::move(__x)); }
    
          template<typename... _Args>
            void
            emplace(_Args&&... __args)
    	{ c.emplace_back(std::forward<_Args>(__args)...); }
    #endif
    
          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue by one.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
    	__glibcxx_requires_nonempty();
    	c.pop_front();
          }
    
    #if __cplusplus >= 201103L
          void
          swap(queue& __q)
          noexcept(noexcept(swap(c, __q.c)))
          {
    	using std::swap;
    	swap(c, __q.c);
          }
    #endif
        };
    
      /**
       *  @brief  Queue equality comparison.
       *  @param  __x  A %queue.
       *  @param  __y  A %queue of the same type as @a __x.
       *  @return  True iff the size and elements of the queues are equal.
       *
       *  This is an equivalence relation.  Complexity and semantics depend on the
       *  underlying sequence type, but the expected rules are:  this relation is
       *  linear in the size of the sequences, and queues are considered equivalent
       *  if their sequences compare equal.
      */
      template<typename _Tp, typename _Seq>
        inline bool
        operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __x.c == __y.c; }
    
      /**
       *  @brief  Queue ordering relation.
       *  @param  __x  A %queue.
       *  @param  __y  A %queue of the same type as @a x.
       *  @return  True iff @a __x is lexicographically less than @a __y.
       *
       *  This is an total ordering relation.  Complexity and semantics
       *  depend on the underlying sequence type, but the expected rules
       *  are: this relation is linear in the size of the sequences, the
       *  elements must be comparable with @c <, and
       *  std::lexicographical_compare() is usually used to make the
       *  determination.
      */
      template<typename _Tp, typename _Seq>
        inline bool
        operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __x.c < __y.c; }
    
      /// Based on operator==
      template<typename _Tp, typename _Seq>
        inline bool
        operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__x == __y); }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __y < __x; }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__y < __x); }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__x < __y); }
    
    #if __cplusplus >= 201103L
      template<typename _Tp, typename _Seq>
        inline void
        swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y)
        noexcept(noexcept(__x.swap(__y)))
        { __x.swap(__y); }
    
      template<typename _Tp, typename _Seq, typename _Alloc>
        struct uses_allocator<queue<_Tp, _Seq>, _Alloc>
        : public uses_allocator<_Seq, _Alloc>::type { };
    #endif
    
      /**
       *  @brief  A standard container automatically sorting its contents.
       *
       *  @ingroup sequences
       *
       *  @tparam _Tp  Type of element.
       *  @tparam _Sequence  Type of underlying sequence, defaults to vector<_Tp>.
       *  @tparam _Compare  Comparison function object type, defaults to 
       *                    less<_Sequence::value_type>.
       *
       *  This is not a true container, but an @e adaptor.  It holds
       *  another container, and provides a wrapper interface to that
       *  container.  The wrapper is what enforces priority-based sorting 
       *  and %queue behavior.  Very few of the standard container/sequence
       *  interface requirements are met (e.g., iterators).
       *
       *  The second template parameter defines the type of the underlying
       *  sequence/container.  It defaults to std::vector, but it can be
       *  any type that supports @c front(), @c push_back, @c pop_back,
       *  and random-access iterators, such as std::deque or an
       *  appropriate user-defined type.
       *
       *  The third template parameter supplies the means of making
       *  priority comparisons.  It defaults to @c less<value_type> but
       *  can be anything defining a strict weak ordering.
       *
       *  Members not found in @a normal containers are @c container_type,
       *  which is a typedef for the second Sequence parameter, and @c
       *  push, @c pop, and @c top, which are standard %queue operations.
       *
       *  @note No equality/comparison operators are provided for
       *  %priority_queue.
       *
       *  @note Sorting of the elements takes place as they are added to,
       *  and removed from, the %priority_queue using the
       *  %priority_queue's member functions.  If you access the elements
       *  by other means, and change their data such that the sorting
       *  order would be different, the %priority_queue will not re-sort
       *  the elements for you.  (How could it know to do so?)
      */
      template<typename _Tp, typename _Sequence = vector<_Tp>,
    	   typename _Compare  = less<typename _Sequence::value_type> >
        class priority_queue
        {
          // concept requirements
          typedef typename _Sequence::value_type _Sequence_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires(_Sequence, _SequenceConcept)
          __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
          __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
          __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp,
    				_BinaryFunctionConcept)
    
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
    
        protected:
          //  See queue::c for notes on these names.
          _Sequence  c;
          _Compare   comp;
    
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
    #if __cplusplus < 201103L
          explicit
          priority_queue(const _Compare& __x = _Compare(),
    		     const _Sequence& __s = _Sequence())
          : c(__s), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    #else
          explicit
          priority_queue(const _Compare& __x,
    		     const _Sequence& __s)
          : c(__s), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    
          explicit
          priority_queue(const _Compare& __x = _Compare(),
    		     _Sequence&& __s = _Sequence())
          : c(std::move(__s)), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    #endif
    
          /**
           *  @brief  Builds a %queue from a range.
           *  @param  __first  An input iterator.
           *  @param  __last  An input iterator.
           *  @param  __x  A comparison functor describing a strict weak ordering.
           *  @param  __s  An initial sequence with which to start.
           *
           *  Begins by copying @a __s, inserting a copy of the elements
           *  from @a [first,last) into the copy of @a __s, then ordering
           *  the copy according to @a __x.
           *
           *  For more information on function objects, see the
           *  documentation on @link functors functor base
           *  classes@endlink.
           */
    #if __cplusplus < 201103L
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x = _Compare(),
    		       const _Sequence& __s = _Sequence())
    	: c(__s), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    #else
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x,
    		       const _Sequence& __s)
    	: c(__s), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x = _Compare(),
    		       _Sequence&& __s = _Sequence())
    	: c(std::move(__s)), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    #endif
    
          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
    
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
    
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          top() const
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  @brief  Add data to the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           */
          void
          push(const value_type& __x)
          {
    	c.push_back(__x);
    	std::push_heap(c.begin(), c.end(), comp);
          }
    
    #if __cplusplus >= 201103L
          void
          push(value_type&& __x)
          {
    	c.push_back(std::move(__x));
    	std::push_heap(c.begin(), c.end(), comp);
          }
    
          template<typename... _Args>
            void
            emplace(_Args&&... __args)
    	{
    	  c.emplace_back(std::forward<_Args>(__args)...);
    	  std::push_heap(c.begin(), c.end(), comp);
    	}
    #endif
    
          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue
           *  by one.  The time complexity of the operation depends on the
           *  underlying sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
    	__glibcxx_requires_nonempty();
    	std::pop_heap(c.begin(), c.end(), comp);
    	c.pop_back();
          }
    
    #if __cplusplus >= 201103L
          void
          swap(priority_queue& __pq)
          noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp)))
          {
    	using std::swap;
    	swap(c, __pq.c);
    	swap(comp, __pq.comp);
          }
    #endif
        };
    
      // No equality/comparison operators are provided for priority_queue.
    
    #if __cplusplus >= 201103L
      template<typename _Tp, typename _Sequence, typename _Compare>
        inline void
        swap(priority_queue<_Tp, _Sequence, _Compare>& __x,
    	 priority_queue<_Tp, _Sequence, _Compare>& __y)
        noexcept(noexcept(__x.swap(__y)))
        { __x.swap(__y); }
    
      template<typename _Tp, typename _Sequence, typename _Compare,
    	   typename _Alloc>
        struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc>
        : public uses_allocator<_Sequence, _Alloc>::type { };
    #endif
    
    _GLIBCXX_END_NAMESPACE_VERSION
    } // namespace
    
    #endif /* _STL_QUEUE_H */
    // Queue implementation -*- C++ -*-
    
    // Copyright (C) 2001-2013 Free Software Foundation, Inc.
    //
    // This file is part of the GNU ISO C++ Library.  This library is free
    // software; you can redistribute it and/or modify it under the
    // terms of the GNU General Public License as published by the
    // Free Software Foundation; either version 3, or (at your option)
    // any later version.
    
    // This library is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU General Public License for more details.
    
    // Under Section 7 of GPL version 3, you are granted additional
    // permissions described in the GCC Runtime Library Exception, version
    // 3.1, as published by the Free Software Foundation.
    
    // You should have received a copy of the GNU General Public License and
    // a copy of the GCC Runtime Library Exception along with this program;
    // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    // <http://www.gnu.org/licenses/>.
    
    /*
     *
     * Copyright (c) 1994
     * Hewlett-Packard Company
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Hewlett-Packard Company makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     *
     *
     * Copyright (c) 1996,1997
     * Silicon Graphics Computer Systems, Inc.
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Silicon Graphics makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     */
    
    /** @file bits/stl_queue.h
     *  This is an internal header file, included by other library headers.
     *  Do not attempt to use it directly. @headername{queue}
     */
    
    #ifndef _STL_QUEUE_H
    #define _STL_QUEUE_H 1
    
    #include <bits/concept_check.h>
    #include <debug/debug.h>
    
    namespace std _GLIBCXX_VISIBILITY(default)
    {
    _GLIBCXX_BEGIN_NAMESPACE_VERSION
    
      /**
       *  @brief  A standard container giving FIFO behavior.
       *
       *  @ingroup sequences
       *
       *  @tparam _Tp  Type of element.
       *  @tparam _Sequence  Type of underlying sequence, defaults to deque<_Tp>.
       *
       *  Meets many of the requirements of a
       *  <a href="tables.html#65">container</a>,
       *  but does not define anything to do with iterators.  Very few of the
       *  other standard container interfaces are defined.
       *
       *  This is not a true container, but an @e adaptor.  It holds another
       *  container, and provides a wrapper interface to that container.  The
       *  wrapper is what enforces strict first-in-first-out %queue behavior.
       *
       *  The second template parameter defines the type of the underlying
       *  sequence/container.  It defaults to std::deque, but it can be any type
       *  that supports @c front, @c back, @c push_back, and @c pop_front,
       *  such as std::list or an appropriate user-defined type.
       *
       *  Members not found in @a normal containers are @c container_type,
       *  which is a typedef for the second Sequence parameter, and @c push and
       *  @c pop, which are standard %queue/FIFO operations.
      */
      template<typename _Tp, typename _Sequence = deque<_Tp> >
        class queue
        {
          // concept requirements
          typedef typename _Sequence::value_type _Sequence_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
          __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
          __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
    
          template<typename _Tp1, typename _Seq1>
            friend bool
            operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
    
          template<typename _Tp1, typename _Seq1>
            friend bool
            operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
    
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
    
        protected:
          /**
           *  'c' is the underlying container.  Maintainers wondering why
           *  this isn't uglified as per style guidelines should note that
           *  this name is specified in the standard, [23.2.3.1].  (Why?
           *  Presumably for the same reason that it's protected instead
           *  of private: to allow derivation.  But none of the other
           *  containers allow for derivation.  Odd.)
           */
          _Sequence c;
    
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
    #if __cplusplus < 201103L
          explicit
          queue(const _Sequence& __c = _Sequence())
          : c(__c) { }
    #else
          explicit
          queue(const _Sequence& __c)
          : c(__c) { }
    
          explicit
          queue(_Sequence&& __c = _Sequence())
          : c(std::move(__c)) { }
    #endif
    
          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
    
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
    
          /**
           *  Returns a read/write reference to the data at the first
           *  element of the %queue.
           */
          reference
          front()
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          front() const
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  Returns a read/write reference to the data at the last
           *  element of the %queue.
           */
          reference
          back()
          {
    	__glibcxx_requires_nonempty();
    	return c.back();
          }
    
          /**
           *  Returns a read-only (constant) reference to the data at the last
           *  element of the %queue.
           */
          const_reference
          back() const
          {
    	__glibcxx_requires_nonempty();
    	return c.back();
          }
    
          /**
           *  @brief  Add data to the end of the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.  The function creates an
           *  element at the end of the %queue and assigns the given data
           *  to it.  The time complexity of the operation depends on the
           *  underlying sequence.
           */
          void
          push(const value_type& __x)
          { c.push_back(__x); }
    
    #if __cplusplus >= 201103L
          void
          push(value_type&& __x)
          { c.push_back(std::move(__x)); }
    
          template<typename... _Args>
            void
            emplace(_Args&&... __args)
    	{ c.emplace_back(std::forward<_Args>(__args)...); }
    #endif
    
          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue by one.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
    	__glibcxx_requires_nonempty();
    	c.pop_front();
          }
    
    #if __cplusplus >= 201103L
          void
          swap(queue& __q)
          noexcept(noexcept(swap(c, __q.c)))
          {
    	using std::swap;
    	swap(c, __q.c);
          }
    #endif
        };
    
      /**
       *  @brief  Queue equality comparison.
       *  @param  __x  A %queue.
       *  @param  __y  A %queue of the same type as @a __x.
       *  @return  True iff the size and elements of the queues are equal.
       *
       *  This is an equivalence relation.  Complexity and semantics depend on the
       *  underlying sequence type, but the expected rules are:  this relation is
       *  linear in the size of the sequences, and queues are considered equivalent
       *  if their sequences compare equal.
      */
      template<typename _Tp, typename _Seq>
        inline bool
        operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __x.c == __y.c; }
    
      /**
       *  @brief  Queue ordering relation.
       *  @param  __x  A %queue.
       *  @param  __y  A %queue of the same type as @a x.
       *  @return  True iff @a __x is lexicographically less than @a __y.
       *
       *  This is an total ordering relation.  Complexity and semantics
       *  depend on the underlying sequence type, but the expected rules
       *  are: this relation is linear in the size of the sequences, the
       *  elements must be comparable with @c <, and
       *  std::lexicographical_compare() is usually used to make the
       *  determination.
      */
      template<typename _Tp, typename _Seq>
        inline bool
        operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __x.c < __y.c; }
    
      /// Based on operator==
      template<typename _Tp, typename _Seq>
        inline bool
        operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__x == __y); }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __y < __x; }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__y < __x); }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__x < __y); }
    
    #if __cplusplus >= 201103L
      template<typename _Tp, typename _Seq>
        inline void
        swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y)
        noexcept(noexcept(__x.swap(__y)))
        { __x.swap(__y); }
    
      template<typename _Tp, typename _Seq, typename _Alloc>
        struct uses_allocator<queue<_Tp, _Seq>, _Alloc>
        : public uses_allocator<_Seq, _Alloc>::type { };
    #endif
    
      /**
       *  @brief  A standard container automatically sorting its contents.
       *
       *  @ingroup sequences
       *
       *  @tparam _Tp  Type of element.
       *  @tparam _Sequence  Type of underlying sequence, defaults to vector<_Tp>.
       *  @tparam _Compare  Comparison function object type, defaults to 
       *                    less<_Sequence::value_type>.
       *
       *  This is not a true container, but an @e adaptor.  It holds
       *  another container, and provides a wrapper interface to that
       *  container.  The wrapper is what enforces priority-based sorting 
       *  and %queue behavior.  Very few of the standard container/sequence
       *  interface requirements are met (e.g., iterators).
       *
       *  The second template parameter defines the type of the underlying
       *  sequence/container.  It defaults to std::vector, but it can be
       *  any type that supports @c front(), @c push_back, @c pop_back,
       *  and random-access iterators, such as std::deque or an
       *  appropriate user-defined type.
       *
       *  The third template parameter supplies the means of making
       *  priority comparisons.  It defaults to @c less<value_type> but
       *  can be anything defining a strict weak ordering.
       *
       *  Members not found in @a normal containers are @c container_type,
       *  which is a typedef for the second Sequence parameter, and @c
       *  push, @c pop, and @c top, which are standard %queue operations.
       *
       *  @note No equality/comparison operators are provided for
       *  %priority_queue.
       *
       *  @note Sorting of the elements takes place as they are added to,
       *  and removed from, the %priority_queue using the
       *  %priority_queue's member functions.  If you access the elements
       *  by other means, and change their data such that the sorting
       *  order would be different, the %priority_queue will not re-sort
       *  the elements for you.  (How could it know to do so?)
      */
      template<typename _Tp, typename _Sequence = vector<_Tp>,
    	   typename _Compare  = less<typename _Sequence::value_type> >
        class priority_queue
        {
          // concept requirements
          typedef typename _Sequence::value_type _Sequence_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires(_Sequence, _SequenceConcept)
          __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
          __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
          __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp,
    				_BinaryFunctionConcept)
    
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
    
        protected:
          //  See queue::c for notes on these names.
          _Sequence  c;
          _Compare   comp;
    
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
    #if __cplusplus < 201103L
          explicit
          priority_queue(const _Compare& __x = _Compare(),
    		     const _Sequence& __s = _Sequence())
          : c(__s), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    #else
          explicit
          priority_queue(const _Compare& __x,
    		     const _Sequence& __s)
          : c(__s), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    
          explicit
          priority_queue(const _Compare& __x = _Compare(),
    		     _Sequence&& __s = _Sequence())
          : c(std::move(__s)), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    #endif
    
          /**
           *  @brief  Builds a %queue from a range.
           *  @param  __first  An input iterator.
           *  @param  __last  An input iterator.
           *  @param  __x  A comparison functor describing a strict weak ordering.
           *  @param  __s  An initial sequence with which to start.
           *
           *  Begins by copying @a __s, inserting a copy of the elements
           *  from @a [first,last) into the copy of @a __s, then ordering
           *  the copy according to @a __x.
           *
           *  For more information on function objects, see the
           *  documentation on @link functors functor base
           *  classes@endlink.
           */
    #if __cplusplus < 201103L
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x = _Compare(),
    		       const _Sequence& __s = _Sequence())
    	: c(__s), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    #else
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x,
    		       const _Sequence& __s)
    	: c(__s), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x = _Compare(),
    		       _Sequence&& __s = _Sequence())
    	: c(std::move(__s)), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    #endif
    
          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
    
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
    
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          top() const
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  @brief  Add data to the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           */
          void
          push(const value_type& __x)
          {
    	c.push_back(__x);
    	std::push_heap(c.begin(), c.end(), comp);
          }
    
    #if __cplusplus >= 201103L
          void
          push(value_type&& __x)
          {
    	c.push_back(std::move(__x));
    	std::push_heap(c.begin(), c.end(), comp);
          }
    
          template<typename... _Args>
            void
            emplace(_Args&&... __args)
    	{
    	  c.emplace_back(std::forward<_Args>(__args)...);
    	  std::push_heap(c.begin(), c.end(), comp);
    	}
    #endif
    
          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue
           *  by one.  The time complexity of the operation depends on the
           *  underlying sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
    	__glibcxx_requires_nonempty();
    	std::pop_heap(c.begin(), c.end(), comp);
    	c.pop_back();
          }
    
    #if __cplusplus >= 201103L
          void
          swap(priority_queue& __pq)
          noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp)))
          {
    	using std::swap;
    	swap(c, __pq.c);
    	swap(comp, __pq.comp);
          }
    #endif
        };
    
      // No equality/comparison operators are provided for priority_queue.
    
    #if __cplusplus >= 201103L
      template<typename _Tp, typename _Sequence, typename _Compare>
        inline void
        swap(priority_queue<_Tp, _Sequence, _Compare>& __x,
    	 priority_queue<_Tp, _Sequence, _Compare>& __y)
        noexcept(noexcept(__x.swap(__y)))
        { __x.swap(__y); }
    
      template<typename _Tp, typename _Sequence, typename _Compare,
    	   typename _Alloc>
        struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc>
        : public uses_allocator<_Sequence, _Alloc>::type { };
    #endif
    
    _GLIBCXX_END_NAMESPACE_VERSION
    } // namespace
    
    #endif /* _STL_QUEUE_H */
    // Queue implementation -*- C++ -*-
    
    // Copyright (C) 2001-2013 Free Software Foundation, Inc.
    //
    // This file is part of the GNU ISO C++ Library.  This library is free
    // software; you can redistribute it and/or modify it under the
    // terms of the GNU General Public License as published by the
    // Free Software Foundation; either version 3, or (at your option)
    // any later version.
    
    // This library is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU General Public License for more details.
    
    // Under Section 7 of GPL version 3, you are granted additional
    // permissions described in the GCC Runtime Library Exception, version
    // 3.1, as published by the Free Software Foundation.
    
    // You should have received a copy of the GNU General Public License and
    // a copy of the GCC Runtime Library Exception along with this program;
    // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    // <http://www.gnu.org/licenses/>.
    
    /*
     *
     * Copyright (c) 1994
     * Hewlett-Packard Company
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Hewlett-Packard Company makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     *
     *
     * Copyright (c) 1996,1997
     * Silicon Graphics Computer Systems, Inc.
     *
     * Permission to use, copy, modify, distribute and sell this software
     * and its documentation for any purpose is hereby granted without fee,
     * provided that the above copyright notice appear in all copies and
     * that both that copyright notice and this permission notice appear
     * in supporting documentation.  Silicon Graphics makes no
     * representations about the suitability of this software for any
     * purpose.  It is provided "as is" without express or implied warranty.
     */
    
    /** @file bits/stl_queue.h
     *  This is an internal header file, included by other library headers.
     *  Do not attempt to use it directly. @headername{queue}
     */
    
    #ifndef _STL_QUEUE_H
    #define _STL_QUEUE_H 1
    
    #include <bits/concept_check.h>
    #include <debug/debug.h>
    
    namespace std _GLIBCXX_VISIBILITY(default)
    {
    _GLIBCXX_BEGIN_NAMESPACE_VERSION
    
      /**
       *  @brief  A standard container giving FIFO behavior.
       *
       *  @ingroup sequences
       *
       *  @tparam _Tp  Type of element.
       *  @tparam _Sequence  Type of underlying sequence, defaults to deque<_Tp>.
       *
       *  Meets many of the requirements of a
       *  <a href="tables.html#65">container</a>,
       *  but does not define anything to do with iterators.  Very few of the
       *  other standard container interfaces are defined.
       *
       *  This is not a true container, but an @e adaptor.  It holds another
       *  container, and provides a wrapper interface to that container.  The
       *  wrapper is what enforces strict first-in-first-out %queue behavior.
       *
       *  The second template parameter defines the type of the underlying
       *  sequence/container.  It defaults to std::deque, but it can be any type
       *  that supports @c front, @c back, @c push_back, and @c pop_front,
       *  such as std::list or an appropriate user-defined type.
       *
       *  Members not found in @a normal containers are @c container_type,
       *  which is a typedef for the second Sequence parameter, and @c push and
       *  @c pop, which are standard %queue/FIFO operations.
      */
      template<typename _Tp, typename _Sequence = deque<_Tp> >
        class queue
        {
          // concept requirements
          typedef typename _Sequence::value_type _Sequence_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
          __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
          __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
    
          template<typename _Tp1, typename _Seq1>
            friend bool
            operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
    
          template<typename _Tp1, typename _Seq1>
            friend bool
            operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
    
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
    
        protected:
          /**
           *  'c' is the underlying container.  Maintainers wondering why
           *  this isn't uglified as per style guidelines should note that
           *  this name is specified in the standard, [23.2.3.1].  (Why?
           *  Presumably for the same reason that it's protected instead
           *  of private: to allow derivation.  But none of the other
           *  containers allow for derivation.  Odd.)
           */
          _Sequence c;
    
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
    #if __cplusplus < 201103L
          explicit
          queue(const _Sequence& __c = _Sequence())
          : c(__c) { }
    #else
          explicit
          queue(const _Sequence& __c)
          : c(__c) { }
    
          explicit
          queue(_Sequence&& __c = _Sequence())
          : c(std::move(__c)) { }
    #endif
    
          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
    
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
    
          /**
           *  Returns a read/write reference to the data at the first
           *  element of the %queue.
           */
          reference
          front()
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          front() const
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  Returns a read/write reference to the data at the last
           *  element of the %queue.
           */
          reference
          back()
          {
    	__glibcxx_requires_nonempty();
    	return c.back();
          }
    
          /**
           *  Returns a read-only (constant) reference to the data at the last
           *  element of the %queue.
           */
          const_reference
          back() const
          {
    	__glibcxx_requires_nonempty();
    	return c.back();
          }
    
          /**
           *  @brief  Add data to the end of the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.  The function creates an
           *  element at the end of the %queue and assigns the given data
           *  to it.  The time complexity of the operation depends on the
           *  underlying sequence.
           */
          void
          push(const value_type& __x)
          { c.push_back(__x); }
    
    #if __cplusplus >= 201103L
          void
          push(value_type&& __x)
          { c.push_back(std::move(__x)); }
    
          template<typename... _Args>
            void
            emplace(_Args&&... __args)
    	{ c.emplace_back(std::forward<_Args>(__args)...); }
    #endif
    
          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue by one.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
    	__glibcxx_requires_nonempty();
    	c.pop_front();
          }
    
    #if __cplusplus >= 201103L
          void
          swap(queue& __q)
          noexcept(noexcept(swap(c, __q.c)))
          {
    	using std::swap;
    	swap(c, __q.c);
          }
    #endif
        };
    
      /**
       *  @brief  Queue equality comparison.
       *  @param  __x  A %queue.
       *  @param  __y  A %queue of the same type as @a __x.
       *  @return  True iff the size and elements of the queues are equal.
       *
       *  This is an equivalence relation.  Complexity and semantics depend on the
       *  underlying sequence type, but the expected rules are:  this relation is
       *  linear in the size of the sequences, and queues are considered equivalent
       *  if their sequences compare equal.
      */
      template<typename _Tp, typename _Seq>
        inline bool
        operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __x.c == __y.c; }
    
      /**
       *  @brief  Queue ordering relation.
       *  @param  __x  A %queue.
       *  @param  __y  A %queue of the same type as @a x.
       *  @return  True iff @a __x is lexicographically less than @a __y.
       *
       *  This is an total ordering relation.  Complexity and semantics
       *  depend on the underlying sequence type, but the expected rules
       *  are: this relation is linear in the size of the sequences, the
       *  elements must be comparable with @c <, and
       *  std::lexicographical_compare() is usually used to make the
       *  determination.
      */
      template<typename _Tp, typename _Seq>
        inline bool
        operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __x.c < __y.c; }
    
      /// Based on operator==
      template<typename _Tp, typename _Seq>
        inline bool
        operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__x == __y); }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return __y < __x; }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__y < __x); }
    
      /// Based on operator<
      template<typename _Tp, typename _Seq>
        inline bool
        operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
        { return !(__x < __y); }
    
    #if __cplusplus >= 201103L
      template<typename _Tp, typename _Seq>
        inline void
        swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y)
        noexcept(noexcept(__x.swap(__y)))
        { __x.swap(__y); }
    
      template<typename _Tp, typename _Seq, typename _Alloc>
        struct uses_allocator<queue<_Tp, _Seq>, _Alloc>
        : public uses_allocator<_Seq, _Alloc>::type { };
    #endif
    
      /**
       *  @brief  A standard container automatically sorting its contents.
       *
       *  @ingroup sequences
       *
       *  @tparam _Tp  Type of element.
       *  @tparam _Sequence  Type of underlying sequence, defaults to vector<_Tp>.
       *  @tparam _Compare  Comparison function object type, defaults to 
       *                    less<_Sequence::value_type>.
       *
       *  This is not a true container, but an @e adaptor.  It holds
       *  another container, and provides a wrapper interface to that
       *  container.  The wrapper is what enforces priority-based sorting 
       *  and %queue behavior.  Very few of the standard container/sequence
       *  interface requirements are met (e.g., iterators).
       *
       *  The second template parameter defines the type of the underlying
       *  sequence/container.  It defaults to std::vector, but it can be
       *  any type that supports @c front(), @c push_back, @c pop_back,
       *  and random-access iterators, such as std::deque or an
       *  appropriate user-defined type.
       *
       *  The third template parameter supplies the means of making
       *  priority comparisons.  It defaults to @c less<value_type> but
       *  can be anything defining a strict weak ordering.
       *
       *  Members not found in @a normal containers are @c container_type,
       *  which is a typedef for the second Sequence parameter, and @c
       *  push, @c pop, and @c top, which are standard %queue operations.
       *
       *  @note No equality/comparison operators are provided for
       *  %priority_queue.
       *
       *  @note Sorting of the elements takes place as they are added to,
       *  and removed from, the %priority_queue using the
       *  %priority_queue's member functions.  If you access the elements
       *  by other means, and change their data such that the sorting
       *  order would be different, the %priority_queue will not re-sort
       *  the elements for you.  (How could it know to do so?)
      */
      template<typename _Tp, typename _Sequence = vector<_Tp>,
    	   typename _Compare  = less<typename _Sequence::value_type> >
        class priority_queue
        {
          // concept requirements
          typedef typename _Sequence::value_type _Sequence_value_type;
          __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
          __glibcxx_class_requires(_Sequence, _SequenceConcept)
          __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
          __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
          __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp,
    				_BinaryFunctionConcept)
    
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
    
        protected:
          //  See queue::c for notes on these names.
          _Sequence  c;
          _Compare   comp;
    
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
    #if __cplusplus < 201103L
          explicit
          priority_queue(const _Compare& __x = _Compare(),
    		     const _Sequence& __s = _Sequence())
          : c(__s), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    #else
          explicit
          priority_queue(const _Compare& __x,
    		     const _Sequence& __s)
          : c(__s), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    
          explicit
          priority_queue(const _Compare& __x = _Compare(),
    		     _Sequence&& __s = _Sequence())
          : c(std::move(__s)), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
    #endif
    
          /**
           *  @brief  Builds a %queue from a range.
           *  @param  __first  An input iterator.
           *  @param  __last  An input iterator.
           *  @param  __x  A comparison functor describing a strict weak ordering.
           *  @param  __s  An initial sequence with which to start.
           *
           *  Begins by copying @a __s, inserting a copy of the elements
           *  from @a [first,last) into the copy of @a __s, then ordering
           *  the copy according to @a __x.
           *
           *  For more information on function objects, see the
           *  documentation on @link functors functor base
           *  classes@endlink.
           */
    #if __cplusplus < 201103L
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x = _Compare(),
    		       const _Sequence& __s = _Sequence())
    	: c(__s), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    #else
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x,
    		       const _Sequence& __s)
    	: c(__s), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    
          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
    		       const _Compare& __x = _Compare(),
    		       _Sequence&& __s = _Sequence())
    	: c(std::move(__s)), comp(__x)
            {
    	  __glibcxx_requires_valid_range(__first, __last);
    	  c.insert(c.end(), __first, __last);
    	  std::make_heap(c.begin(), c.end(), comp);
    	}
    #endif
    
          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
    
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
    
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          top() const
          {
    	__glibcxx_requires_nonempty();
    	return c.front();
          }
    
          /**
           *  @brief  Add data to the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           */
          void
          push(const value_type& __x)
          {
    	c.push_back(__x);
    	std::push_heap(c.begin(), c.end(), comp);
          }
    
    #if __cplusplus >= 201103L
          void
          push(value_type&& __x)
          {
    	c.push_back(std::move(__x));
    	std::push_heap(c.begin(), c.end(), comp);
          }
    
          template<typename... _Args>
            void
            emplace(_Args&&... __args)
    	{
    	  c.emplace_back(std::forward<_Args>(__args)...);
    	  std::push_heap(c.begin(), c.end(), comp);
    	}
    #endif
    
          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue
           *  by one.  The time complexity of the operation depends on the
           *  underlying sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
    	__glibcxx_requires_nonempty();
    	std::pop_heap(c.begin(), c.end(), comp);
    	c.pop_back();
          }
    
    #if __cplusplus >= 201103L
          void
          swap(priority_queue& __pq)
          noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp)))
          {
    	using std::swap;
    	swap(c, __pq.c);
    	swap(comp, __pq.comp);
          }
    #endif
        };
    
      // No equality/comparison operators are provided for priority_queue.
    
    #if __cplusplus >= 201103L
      template<typename _Tp, typename _Sequence, typename _Compare>
        inline void
        swap(priority_queue<_Tp, _Sequence, _Compare>& __x,
    	 priority_queue<_Tp, _Sequence, _Compare>& __y)
        noexcept(noexcept(__x.swap(__y)))
        { __x.swap(__y); }
    
      template<typename _Tp, typename _Sequence, typename _Compare,
    	   typename _Alloc>
        struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc>
        : public uses_allocator<_Sequence, _Alloc>::type { };
    #endif
    
    _GLIBCXX_END_NAMESPACE_VERSION
    } // namespace
    
    #endif /* _STL_QUEUE_H */
    ```
    `
    • 1
      @ 2026-4-7 18:15:22
      // Queue implementation -*- C++ -*-
      
      // Copyright (C) 2001-2013 Free Software Foundation, Inc.
      //
      // This file is part of the GNU ISO C++ Library.  This library is free
      // software; you can redistribute it and/or modify it under the
      // terms of the GNU General Public License as published by the
      // Free Software Foundation; either version 3, or (at your option)
      // any later version.
      
      // This library is distributed in the hope that it will be useful,
      // but WITHOUT ANY WARRANTY; without even the implied warranty of
      // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      // GNU General Public License for more details.
      
      // Under Section 7 of GPL version 3, you are granted additional
      // permissions described in the GCC Runtime Library Exception, version
      // 3.1, as published by the Free Software Foundation.
      
      // You should have received a copy of the GNU General Public License and
      // a copy of the GCC Runtime Library Exception along with this program;
      // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      // <http://www.gnu.org/licenses/>.
      
      /*
       *
       * Copyright (c) 1994
       * Hewlett-Packard Company
       *
       * Permission to use, copy, modify, distribute and sell this software
       * and its documentation for any purpose is hereby granted without fee,
       * provided that the above copyright notice appear in all copies and
       * that both that copyright notice and this permission notice appear
       * in supporting documentation.  Hewlett-Packard Company makes no
       * representations about the suitability of this software for any
       * purpose.  It is provided "as is" without express or implied warranty.
       *
       *
       * Copyright (c) 1996,1997
       * Silicon Graphics Computer Systems, Inc.
       *
       * Permission to use, copy, modify, distribute and sell this software
       * and its documentation for any purpose is hereby granted without fee,
       * provided that the above copyright notice appear in all copies and
       * that both that copyright notice and this permission notice appear
       * in supporting documentation.  Silicon Graphics makes no
       * representations about the suitability of this software for any
       * purpose.  It is provided "as is" without express or implied warranty.
       */
      
      /** @file bits/stl_queue.h
       *  This is an internal header file, included by other library headers.
       *  Do not attempt to use it directly. @headername{queue}
       */
      
      #ifndef _STL_QUEUE_H
      #define _STL_QUEUE_H 1
      
      #include <bits/concept_check.h>
      #include <debug/debug.h>
      
      namespace std _GLIBCXX_VISIBILITY(default)
      {
      _GLIBCXX_BEGIN_NAMESPACE_VERSION
      
        /**
         *  @brief  A standard container giving FIFO behavior.
         *
         *  @ingroup sequences
         *
         *  @tparam _Tp  Type of element.
         *  @tparam _Sequence  Type of underlying sequence, defaults to deque<_Tp>.
         *
         *  Meets many of the requirements of a
         *  <a href="tables.html#65">container</a>,
         *  but does not define anything to do with iterators.  Very few of the
         *  other standard container interfaces are defined.
         *
         *  This is not a true container, but an @e adaptor.  It holds another
         *  container, and provides a wrapper interface to that container.  The
         *  wrapper is what enforces strict first-in-first-out %queue behavior.
         *
         *  The second template parameter defines the type of the underlying
         *  sequence/container.  It defaults to std::deque, but it can be any type
         *  that supports @c front, @c back, @c push_back, and @c pop_front,
         *  such as std::list or an appropriate user-defined type.
         *
         *  Members not found in @a normal containers are @c container_type,
         *  which is a typedef for the second Sequence parameter, and @c push and
         *  @c pop, which are standard %queue/FIFO operations.
        */
        template<typename _Tp, typename _Sequence = deque<_Tp> >
          class queue
          {
            // concept requirements
            typedef typename _Sequence::value_type _Sequence_value_type;
            __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
            __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
            __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
            __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
      
            template<typename _Tp1, typename _Seq1>
              friend bool
              operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
      
            template<typename _Tp1, typename _Seq1>
              friend bool
              operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
      
          public:
            typedef typename _Sequence::value_type                value_type;
            typedef typename _Sequence::reference                 reference;
            typedef typename _Sequence::const_reference           const_reference;
            typedef typename _Sequence::size_type                 size_type;
            typedef          _Sequence                            container_type;
      
          protected:
            /**
             *  'c' is the underlying container.  Maintainers wondering why
             *  this isn't uglified as per style guidelines should note that
             *  this name is specified in the standard, [23.2.3.1].  (Why?
             *  Presumably for the same reason that it's protected instead
             *  of private: to allow derivation.  But none of the other
             *  containers allow for derivation.  Odd.)
             */
            _Sequence c;
      
          public:
            /**
             *  @brief  Default constructor creates no elements.
             */
      #if __cplusplus < 201103L
            explicit
            queue(const _Sequence& __c = _Sequence())
            : c(__c) { }
      #else
            explicit
            queue(const _Sequence& __c)
            : c(__c) { }
      
            explicit
            queue(_Sequence&& __c = _Sequence())
            : c(std::move(__c)) { }
      #endif
      
            /**
             *  Returns true if the %queue is empty.
             */
            bool
            empty() const
            { return c.empty(); }
      
            /**  Returns the number of elements in the %queue.  */
            size_type
            size() const
            { return c.size(); }
      
            /**
             *  Returns a read/write reference to the data at the first
             *  element of the %queue.
             */
            reference
            front()
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  Returns a read-only (constant) reference to the data at the first
             *  element of the %queue.
             */
            const_reference
            front() const
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  Returns a read/write reference to the data at the last
             *  element of the %queue.
             */
            reference
            back()
            {
      	__glibcxx_requires_nonempty();
      	return c.back();
            }
      
            /**
             *  Returns a read-only (constant) reference to the data at the last
             *  element of the %queue.
             */
            const_reference
            back() const
            {
      	__glibcxx_requires_nonempty();
      	return c.back();
            }
      
            /**
             *  @brief  Add data to the end of the %queue.
             *  @param  __x  Data to be added.
             *
             *  This is a typical %queue operation.  The function creates an
             *  element at the end of the %queue and assigns the given data
             *  to it.  The time complexity of the operation depends on the
             *  underlying sequence.
             */
            void
            push(const value_type& __x)
            { c.push_back(__x); }
      
      #if __cplusplus >= 201103L
            void
            push(value_type&& __x)
            { c.push_back(std::move(__x)); }
      
            template<typename... _Args>
              void
              emplace(_Args&&... __args)
      	{ c.emplace_back(std::forward<_Args>(__args)...); }
      #endif
      
            /**
             *  @brief  Removes first element.
             *
             *  This is a typical %queue operation.  It shrinks the %queue by one.
             *  The time complexity of the operation depends on the underlying
             *  sequence.
             *
             *  Note that no data is returned, and if the first element's
             *  data is needed, it should be retrieved before pop() is
             *  called.
             */
            void
            pop()
            {
      	__glibcxx_requires_nonempty();
      	c.pop_front();
            }
      
      #if __cplusplus >= 201103L
            void
            swap(queue& __q)
            noexcept(noexcept(swap(c, __q.c)))
            {
      	using std::swap;
      	swap(c, __q.c);
            }
      #endif
          };
      
        /**
         *  @brief  Queue equality comparison.
         *  @param  __x  A %queue.
         *  @param  __y  A %queue of the same type as @a __x.
         *  @return  True iff the size and elements of the queues are equal.
         *
         *  This is an equivalence relation.  Complexity and semantics depend on the
         *  underlying sequence type, but the expected rules are:  this relation is
         *  linear in the size of the sequences, and queues are considered equivalent
         *  if their sequences compare equal.
        */
        template<typename _Tp, typename _Seq>
          inline bool
          operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __x.c == __y.c; }
      
        /**
         *  @brief  Queue ordering relation.
         *  @param  __x  A %queue.
         *  @param  __y  A %queue of the same type as @a x.
         *  @return  True iff @a __x is lexicographically less than @a __y.
         *
         *  This is an total ordering relation.  Complexity and semantics
         *  depend on the underlying sequence type, but the expected rules
         *  are: this relation is linear in the size of the sequences, the
         *  elements must be comparable with @c <, and
         *  std::lexicographical_compare() is usually used to make the
         *  determination.
        */
        template<typename _Tp, typename _Seq>
          inline bool
          operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __x.c < __y.c; }
      
        /// Based on operator==
        template<typename _Tp, typename _Seq>
          inline bool
          operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__x == __y); }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __y < __x; }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__y < __x); }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__x < __y); }
      
      #if __cplusplus >= 201103L
        template<typename _Tp, typename _Seq>
          inline void
          swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y)
          noexcept(noexcept(__x.swap(__y)))
          { __x.swap(__y); }
      
        template<typename _Tp, typename _Seq, typename _Alloc>
          struct uses_allocator<queue<_Tp, _Seq>, _Alloc>
          : public uses_allocator<_Seq, _Alloc>::type { };
      #endif
      
        /**
         *  @brief  A standard container automatically sorting its contents.
         *
         *  @ingroup sequences
         *
         *  @tparam _Tp  Type of element.
         *  @tparam _Sequence  Type of underlying sequence, defaults to vector<_Tp>.
         *  @tparam _Compare  Comparison function object type, defaults to 
         *                    less<_Sequence::value_type>.
         *
         *  This is not a true container, but an @e adaptor.  It holds
         *  another container, and provides a wrapper interface to that
         *  container.  The wrapper is what enforces priority-based sorting 
         *  and %queue behavior.  Very few of the standard container/sequence
         *  interface requirements are met (e.g., iterators).
         *
         *  The second template parameter defines the type of the underlying
         *  sequence/container.  It defaults to std::vector, but it can be
         *  any type that supports @c front(), @c push_back, @c pop_back,
         *  and random-access iterators, such as std::deque or an
         *  appropriate user-defined type.
         *
         *  The third template parameter supplies the means of making
         *  priority comparisons.  It defaults to @c less<value_type> but
         *  can be anything defining a strict weak ordering.
         *
         *  Members not found in @a normal containers are @c container_type,
         *  which is a typedef for the second Sequence parameter, and @c
         *  push, @c pop, and @c top, which are standard %queue operations.
         *
         *  @note No equality/comparison operators are provided for
         *  %priority_queue.
         *
         *  @note Sorting of the elements takes place as they are added to,
         *  and removed from, the %priority_queue using the
         *  %priority_queue's member functions.  If you access the elements
         *  by other means, and change their data such that the sorting
         *  order would be different, the %priority_queue will not re-sort
         *  the elements for you.  (How could it know to do so?)
        */
        template<typename _Tp, typename _Sequence = vector<_Tp>,
      	   typename _Compare  = less<typename _Sequence::value_type> >
          class priority_queue
          {
            // concept requirements
            typedef typename _Sequence::value_type _Sequence_value_type;
            __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
            __glibcxx_class_requires(_Sequence, _SequenceConcept)
            __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
            __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
            __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp,
      				_BinaryFunctionConcept)
      
          public:
            typedef typename _Sequence::value_type                value_type;
            typedef typename _Sequence::reference                 reference;
            typedef typename _Sequence::const_reference           const_reference;
            typedef typename _Sequence::size_type                 size_type;
            typedef          _Sequence                            container_type;
      
          protected:
            //  See queue::c for notes on these names.
            _Sequence  c;
            _Compare   comp;
      
          public:
            /**
             *  @brief  Default constructor creates no elements.
             */
      #if __cplusplus < 201103L
            explicit
            priority_queue(const _Compare& __x = _Compare(),
      		     const _Sequence& __s = _Sequence())
            : c(__s), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      #else
            explicit
            priority_queue(const _Compare& __x,
      		     const _Sequence& __s)
            : c(__s), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      
            explicit
            priority_queue(const _Compare& __x = _Compare(),
      		     _Sequence&& __s = _Sequence())
            : c(std::move(__s)), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      #endif
      
            /**
             *  @brief  Builds a %queue from a range.
             *  @param  __first  An input iterator.
             *  @param  __last  An input iterator.
             *  @param  __x  A comparison functor describing a strict weak ordering.
             *  @param  __s  An initial sequence with which to start.
             *
             *  Begins by copying @a __s, inserting a copy of the elements
             *  from @a [first,last) into the copy of @a __s, then ordering
             *  the copy according to @a __x.
             *
             *  For more information on function objects, see the
             *  documentation on @link functors functor base
             *  classes@endlink.
             */
      #if __cplusplus < 201103L
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x = _Compare(),
      		       const _Sequence& __s = _Sequence())
      	: c(__s), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      #else
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x,
      		       const _Sequence& __s)
      	: c(__s), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x = _Compare(),
      		       _Sequence&& __s = _Sequence())
      	: c(std::move(__s)), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      #endif
      
            /**
             *  Returns true if the %queue is empty.
             */
            bool
            empty() const
            { return c.empty(); }
      
            /**  Returns the number of elements in the %queue.  */
            size_type
            size() const
            { return c.size(); }
      
            /**
             *  Returns a read-only (constant) reference to the data at the first
             *  element of the %queue.
             */
            const_reference
            top() const
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  @brief  Add data to the %queue.
             *  @param  __x  Data to be added.
             *
             *  This is a typical %queue operation.
             *  The time complexity of the operation depends on the underlying
             *  sequence.
             */
            void
            push(const value_type& __x)
            {
      	c.push_back(__x);
      	std::push_heap(c.begin(), c.end(), comp);
            }
      
      #if __cplusplus >= 201103L
            void
            push(value_type&& __x)
            {
      	c.push_back(std::move(__x));
      	std::push_heap(c.begin(), c.end(), comp);
            }
      
            template<typename... _Args>
              void
              emplace(_Args&&... __args)
      	{
      	  c.emplace_back(std::forward<_Args>(__args)...);
      	  std::push_heap(c.begin(), c.end(), comp);
      	}
      #endif
      
            /**
             *  @brief  Removes first element.
             *
             *  This is a typical %queue operation.  It shrinks the %queue
             *  by one.  The time complexity of the operation depends on the
             *  underlying sequence.
             *
             *  Note that no data is returned, and if the first element's
             *  data is needed, it should be retrieved before pop() is
             *  called.
             */
            void
            pop()
            {
      	__glibcxx_requires_nonempty();
      	std::pop_heap(c.begin(), c.end(), comp);
      	c.pop_back();
            }
      
      #if __cplusplus >= 201103L
            void
            swap(priority_queue& __pq)
            noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp)))
            {
      	using std::swap;
      	swap(c, __pq.c);
      	swap(comp, __pq.comp);
            }
      #endif
          };
      
        // No equality/comparison operators are provided for priority_queue.
      
      #if __cplusplus >= 201103L
        template<typename _Tp, typename _Sequence, typename _Compare>
          inline void
          swap(priority_queue<_Tp, _Sequence, _Compare>& __x,
      	 priority_queue<_Tp, _Sequence, _Compare>& __y)
          noexcept(noexcept(__x.swap(__y)))
          { __x.swap(__y); }
      
        template<typename _Tp, typename _Sequence, typename _Compare,
      	   typename _Alloc>
          struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc>
          : public uses_allocator<_Sequence, _Alloc>::type { };
      #endif
      
      _GLIBCXX_END_NAMESPACE_VERSION
      } // namespace
      
      #endif /* _STL_QUEUE_H */
      // Queue implementation -*- C++ -*-
      
      // Copyright (C) 2001-2013 Free Software Foundation, Inc.
      //
      // This file is part of the GNU ISO C++ Library.  This library is free
      // software; you can redistribute it and/or modify it under the
      // terms of the GNU General Public License as published by the
      // Free Software Foundation; either version 3, or (at your option)
      // any later version.
      
      // This library is distributed in the hope that it will be useful,
      // but WITHOUT ANY WARRANTY; without even the implied warranty of
      // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      // GNU General Public License for more details.
      
      // Under Section 7 of GPL version 3, you are granted additional
      // permissions described in the GCC Runtime Library Exception, version
      // 3.1, as published by the Free Software Foundation.
      
      // You should have received a copy of the GNU General Public License and
      // a copy of the GCC Runtime Library Exception along with this program;
      // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      // <http://www.gnu.org/licenses/>.
      
      /*
       *
       * Copyright (c) 1994
       * Hewlett-Packard Company
       *
       * Permission to use, copy, modify, distribute and sell this software
       * and its documentation for any purpose is hereby granted without fee,
       * provided that the above copyright notice appear in all copies and
       * that both that copyright notice and this permission notice appear
       * in supporting documentation.  Hewlett-Packard Company makes no
       * representations about the suitability of this software for any
       * purpose.  It is provided "as is" without express or implied warranty.
       *
       *
       * Copyright (c) 1996,1997
       * Silicon Graphics Computer Systems, Inc.
       *
       * Permission to use, copy, modify, distribute and sell this software
       * and its documentation for any purpose is hereby granted without fee,
       * provided that the above copyright notice appear in all copies and
       * that both that copyright notice and this permission notice appear
       * in supporting documentation.  Silicon Graphics makes no
       * representations about the suitability of this software for any
       * purpose.  It is provided "as is" without express or implied warranty.
       */
      
      /** @file bits/stl_queue.h
       *  This is an internal header file, included by other library headers.
       *  Do not attempt to use it directly. @headername{queue}
       */
      
      #ifndef _STL_QUEUE_H
      #define _STL_QUEUE_H 1
      
      #include <bits/concept_check.h>
      #include <debug/debug.h>
      
      namespace std _GLIBCXX_VISIBILITY(default)
      {
      _GLIBCXX_BEGIN_NAMESPACE_VERSION
      
        /**
         *  @brief  A standard container giving FIFO behavior.
         *
         *  @ingroup sequences
         *
         *  @tparam _Tp  Type of element.
         *  @tparam _Sequence  Type of underlying sequence, defaults to deque<_Tp>.
         *
         *  Meets many of the requirements of a
         *  <a href="tables.html#65">container</a>,
         *  but does not define anything to do with iterators.  Very few of the
         *  other standard container interfaces are defined.
         *
         *  This is not a true container, but an @e adaptor.  It holds another
         *  container, and provides a wrapper interface to that container.  The
         *  wrapper is what enforces strict first-in-first-out %queue behavior.
         *
         *  The second template parameter defines the type of the underlying
         *  sequence/container.  It defaults to std::deque, but it can be any type
         *  that supports @c front, @c back, @c push_back, and @c pop_front,
         *  such as std::list or an appropriate user-defined type.
         *
         *  Members not found in @a normal containers are @c container_type,
         *  which is a typedef for the second Sequence parameter, and @c push and
         *  @c pop, which are standard %queue/FIFO operations.
        */
        template<typename _Tp, typename _Sequence = deque<_Tp> >
          class queue
          {
            // concept requirements
            typedef typename _Sequence::value_type _Sequence_value_type;
            __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
            __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
            __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
            __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
      
            template<typename _Tp1, typename _Seq1>
              friend bool
              operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
      
            template<typename _Tp1, typename _Seq1>
              friend bool
              operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
      
          public:
            typedef typename _Sequence::value_type                value_type;
            typedef typename _Sequence::reference                 reference;
            typedef typename _Sequence::const_reference           const_reference;
            typedef typename _Sequence::size_type                 size_type;
            typedef          _Sequence                            container_type;
      
          protected:
            /**
             *  'c' is the underlying container.  Maintainers wondering why
             *  this isn't uglified as per style guidelines should note that
             *  this name is specified in the standard, [23.2.3.1].  (Why?
             *  Presumably for the same reason that it's protected instead
             *  of private: to allow derivation.  But none of the other
             *  containers allow for derivation.  Odd.)
             */
            _Sequence c;
      
          public:
            /**
             *  @brief  Default constructor creates no elements.
             */
      #if __cplusplus < 201103L
            explicit
            queue(const _Sequence& __c = _Sequence())
            : c(__c) { }
      #else
            explicit
            queue(const _Sequence& __c)
            : c(__c) { }
      
            explicit
            queue(_Sequence&& __c = _Sequence())
            : c(std::move(__c)) { }
      #endif
      
            /**
             *  Returns true if the %queue is empty.
             */
            bool
            empty() const
            { return c.empty(); }
      
            /**  Returns the number of elements in the %queue.  */
            size_type
            size() const
            { return c.size(); }
      
            /**
             *  Returns a read/write reference to the data at the first
             *  element of the %queue.
             */
            reference
            front()
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  Returns a read-only (constant) reference to the data at the first
             *  element of the %queue.
             */
            const_reference
            front() const
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  Returns a read/write reference to the data at the last
             *  element of the %queue.
             */
            reference
            back()
            {
      	__glibcxx_requires_nonempty();
      	return c.back();
            }
      
            /**
             *  Returns a read-only (constant) reference to the data at the last
             *  element of the %queue.
             */
            const_reference
            back() const
            {
      	__glibcxx_requires_nonempty();
      	return c.back();
            }
      
            /**
             *  @brief  Add data to the end of the %queue.
             *  @param  __x  Data to be added.
             *
             *  This is a typical %queue operation.  The function creates an
             *  element at the end of the %queue and assigns the given data
             *  to it.  The time complexity of the operation depends on the
             *  underlying sequence.
             */
            void
            push(const value_type& __x)
            { c.push_back(__x); }
      
      #if __cplusplus >= 201103L
            void
            push(value_type&& __x)
            { c.push_back(std::move(__x)); }
      
            template<typename... _Args>
              void
              emplace(_Args&&... __args)
      	{ c.emplace_back(std::forward<_Args>(__args)...); }
      #endif
      
            /**
             *  @brief  Removes first element.
             *
             *  This is a typical %queue operation.  It shrinks the %queue by one.
             *  The time complexity of the operation depends on the underlying
             *  sequence.
             *
             *  Note that no data is returned, and if the first element's
             *  data is needed, it should be retrieved before pop() is
             *  called.
             */
            void
            pop()
            {
      	__glibcxx_requires_nonempty();
      	c.pop_front();
            }
      
      #if __cplusplus >= 201103L
            void
            swap(queue& __q)
            noexcept(noexcept(swap(c, __q.c)))
            {
      	using std::swap;
      	swap(c, __q.c);
            }
      #endif
          };
      
        /**
         *  @brief  Queue equality comparison.
         *  @param  __x  A %queue.
         *  @param  __y  A %queue of the same type as @a __x.
         *  @return  True iff the size and elements of the queues are equal.
         *
         *  This is an equivalence relation.  Complexity and semantics depend on the
         *  underlying sequence type, but the expected rules are:  this relation is
         *  linear in the size of the sequences, and queues are considered equivalent
         *  if their sequences compare equal.
        */
        template<typename _Tp, typename _Seq>
          inline bool
          operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __x.c == __y.c; }
      
        /**
         *  @brief  Queue ordering relation.
         *  @param  __x  A %queue.
         *  @param  __y  A %queue of the same type as @a x.
         *  @return  True iff @a __x is lexicographically less than @a __y.
         *
         *  This is an total ordering relation.  Complexity and semantics
         *  depend on the underlying sequence type, but the expected rules
         *  are: this relation is linear in the size of the sequences, the
         *  elements must be comparable with @c <, and
         *  std::lexicographical_compare() is usually used to make the
         *  determination.
        */
        template<typename _Tp, typename _Seq>
          inline bool
          operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __x.c < __y.c; }
      
        /// Based on operator==
        template<typename _Tp, typename _Seq>
          inline bool
          operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__x == __y); }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __y < __x; }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__y < __x); }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__x < __y); }
      
      #if __cplusplus >= 201103L
        template<typename _Tp, typename _Seq>
          inline void
          swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y)
          noexcept(noexcept(__x.swap(__y)))
          { __x.swap(__y); }
      
        template<typename _Tp, typename _Seq, typename _Alloc>
          struct uses_allocator<queue<_Tp, _Seq>, _Alloc>
          : public uses_allocator<_Seq, _Alloc>::type { };
      #endif
      
        /**
         *  @brief  A standard container automatically sorting its contents.
         *
         *  @ingroup sequences
         *
         *  @tparam _Tp  Type of element.
         *  @tparam _Sequence  Type of underlying sequence, defaults to vector<_Tp>.
         *  @tparam _Compare  Comparison function object type, defaults to 
         *                    less<_Sequence::value_type>.
         *
         *  This is not a true container, but an @e adaptor.  It holds
         *  another container, and provides a wrapper interface to that
         *  container.  The wrapper is what enforces priority-based sorting 
         *  and %queue behavior.  Very few of the standard container/sequence
         *  interface requirements are met (e.g., iterators).
         *
         *  The second template parameter defines the type of the underlying
         *  sequence/container.  It defaults to std::vector, but it can be
         *  any type that supports @c front(), @c push_back, @c pop_back,
         *  and random-access iterators, such as std::deque or an
         *  appropriate user-defined type.
         *
         *  The third template parameter supplies the means of making
         *  priority comparisons.  It defaults to @c less<value_type> but
         *  can be anything defining a strict weak ordering.
         *
         *  Members not found in @a normal containers are @c container_type,
         *  which is a typedef for the second Sequence parameter, and @c
         *  push, @c pop, and @c top, which are standard %queue operations.
         *
         *  @note No equality/comparison operators are provided for
         *  %priority_queue.
         *
         *  @note Sorting of the elements takes place as they are added to,
         *  and removed from, the %priority_queue using the
         *  %priority_queue's member functions.  If you access the elements
         *  by other means, and change their data such that the sorting
         *  order would be different, the %priority_queue will not re-sort
         *  the elements for you.  (How could it know to do so?)
        */
        template<typename _Tp, typename _Sequence = vector<_Tp>,
      	   typename _Compare  = less<typename _Sequence::value_type> >
          class priority_queue
          {
            // concept requirements
            typedef typename _Sequence::value_type _Sequence_value_type;
            __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
            __glibcxx_class_requires(_Sequence, _SequenceConcept)
            __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
            __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
            __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp,
      				_BinaryFunctionConcept)
      
          public:
            typedef typename _Sequence::value_type                value_type;
            typedef typename _Sequence::reference                 reference;
            typedef typename _Sequence::const_reference           const_reference;
            typedef typename _Sequence::size_type                 size_type;
            typedef          _Sequence                            container_type;
      
          protected:
            //  See queue::c for notes on these names.
            _Sequence  c;
            _Compare   comp;
      
          public:
            /**
             *  @brief  Default constructor creates no elements.
             */
      #if __cplusplus < 201103L
            explicit
            priority_queue(const _Compare& __x = _Compare(),
      		     const _Sequence& __s = _Sequence())
            : c(__s), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      #else
            explicit
            priority_queue(const _Compare& __x,
      		     const _Sequence& __s)
            : c(__s), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      
            explicit
            priority_queue(const _Compare& __x = _Compare(),
      		     _Sequence&& __s = _Sequence())
            : c(std::move(__s)), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      #endif
      
            /**
             *  @brief  Builds a %queue from a range.
             *  @param  __first  An input iterator.
             *  @param  __last  An input iterator.
             *  @param  __x  A comparison functor describing a strict weak ordering.
             *  @param  __s  An initial sequence with which to start.
             *
             *  Begins by copying @a __s, inserting a copy of the elements
             *  from @a [first,last) into the copy of @a __s, then ordering
             *  the copy according to @a __x.
             *
             *  For more information on function objects, see the
             *  documentation on @link functors functor base
             *  classes@endlink.
             */
      #if __cplusplus < 201103L
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x = _Compare(),
      		       const _Sequence& __s = _Sequence())
      	: c(__s), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      #else
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x,
      		       const _Sequence& __s)
      	: c(__s), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x = _Compare(),
      		       _Sequence&& __s = _Sequence())
      	: c(std::move(__s)), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      #endif
      
            /**
             *  Returns true if the %queue is empty.
             */
            bool
            empty() const
            { return c.empty(); }
      
            /**  Returns the number of elements in the %queue.  */
            size_type
            size() const
            { return c.size(); }
      
            /**
             *  Returns a read-only (constant) reference to the data at the first
             *  element of the %queue.
             */
            const_reference
            top() const
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  @brief  Add data to the %queue.
             *  @param  __x  Data to be added.
             *
             *  This is a typical %queue operation.
             *  The time complexity of the operation depends on the underlying
             *  sequence.
             */
            void
            push(const value_type& __x)
            {
      	c.push_back(__x);
      	std::push_heap(c.begin(), c.end(), comp);
            }
      
      #if __cplusplus >= 201103L
            void
            push(value_type&& __x)
            {
      	c.push_back(std::move(__x));
      	std::push_heap(c.begin(), c.end(), comp);
            }
      
            template<typename... _Args>
              void
              emplace(_Args&&... __args)
      	{
      	  c.emplace_back(std::forward<_Args>(__args)...);
      	  std::push_heap(c.begin(), c.end(), comp);
      	}
      #endif
      
            /**
             *  @brief  Removes first element.
             *
             *  This is a typical %queue operation.  It shrinks the %queue
             *  by one.  The time complexity of the operation depends on the
             *  underlying sequence.
             *
             *  Note that no data is returned, and if the first element's
             *  data is needed, it should be retrieved before pop() is
             *  called.
             */
            void
            pop()
            {
      	__glibcxx_requires_nonempty();
      	std::pop_heap(c.begin(), c.end(), comp);
      	c.pop_back();
            }
      
      #if __cplusplus >= 201103L
            void
            swap(priority_queue& __pq)
            noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp)))
            {
      	using std::swap;
      	swap(c, __pq.c);
      	swap(comp, __pq.comp);
            }
      #endif
          };
      
        // No equality/comparison operators are provided for priority_queue.
      
      #if __cplusplus >= 201103L
        template<typename _Tp, typename _Sequence, typename _Compare>
          inline void
          swap(priority_queue<_Tp, _Sequence, _Compare>& __x,
      	 priority_queue<_Tp, _Sequence, _Compare>& __y)
          noexcept(noexcept(__x.swap(__y)))
          { __x.swap(__y); }
      
        template<typename _Tp, typename _Sequence, typename _Compare,
      	   typename _Alloc>
          struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc>
          : public uses_allocator<_Sequence, _Alloc>::type { };
      #endif
      
      _GLIBCXX_END_NAMESPACE_VERSION
      } // namespace
      
      #endif /* _STL_QUEUE_H */
      // Queue implementation -*- C++ -*-
      
      // Copyright (C) 2001-2013 Free Software Foundation, Inc.
      //
      // This file is part of the GNU ISO C++ Library.  This library is free
      // software; you can redistribute it and/or modify it under the
      // terms of the GNU General Public License as published by the
      // Free Software Foundation; either version 3, or (at your option)
      // any later version.
      
      // This library is distributed in the hope that it will be useful,
      // but WITHOUT ANY WARRANTY; without even the implied warranty of
      // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      // GNU General Public License for more details.
      
      // Under Section 7 of GPL version 3, you are granted additional
      // permissions described in the GCC Runtime Library Exception, version
      // 3.1, as published by the Free Software Foundation.
      
      // You should have received a copy of the GNU General Public License and
      // a copy of the GCC Runtime Library Exception along with this program;
      // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      // <http://www.gnu.org/licenses/>.
      
      /*
       *
       * Copyright (c) 1994
       * Hewlett-Packard Company
       *
       * Permission to use, copy, modify, distribute and sell this software
       * and its documentation for any purpose is hereby granted without fee,
       * provided that the above copyright notice appear in all copies and
       * that both that copyright notice and this permission notice appear
       * in supporting documentation.  Hewlett-Packard Company makes no
       * representations about the suitability of this software for any
       * purpose.  It is provided "as is" without express or implied warranty.
       *
       *
       * Copyright (c) 1996,1997
       * Silicon Graphics Computer Systems, Inc.
       *
       * Permission to use, copy, modify, distribute and sell this software
       * and its documentation for any purpose is hereby granted without fee,
       * provided that the above copyright notice appear in all copies and
       * that both that copyright notice and this permission notice appear
       * in supporting documentation.  Silicon Graphics makes no
       * representations about the suitability of this software for any
       * purpose.  It is provided "as is" without express or implied warranty.
       */
      
      /** @file bits/stl_queue.h
       *  This is an internal header file, included by other library headers.
       *  Do not attempt to use it directly. @headername{queue}
       */
      
      #ifndef _STL_QUEUE_H
      #define _STL_QUEUE_H 1
      
      #include <bits/concept_check.h>
      #include <debug/debug.h>
      
      namespace std _GLIBCXX_VISIBILITY(default)
      {
      _GLIBCXX_BEGIN_NAMESPACE_VERSION
      
        /**
         *  @brief  A standard container giving FIFO behavior.
         *
         *  @ingroup sequences
         *
         *  @tparam _Tp  Type of element.
         *  @tparam _Sequence  Type of underlying sequence, defaults to deque<_Tp>.
         *
         *  Meets many of the requirements of a
         *  <a href="tables.html#65">container</a>,
         *  but does not define anything to do with iterators.  Very few of the
         *  other standard container interfaces are defined.
         *
         *  This is not a true container, but an @e adaptor.  It holds another
         *  container, and provides a wrapper interface to that container.  The
         *  wrapper is what enforces strict first-in-first-out %queue behavior.
         *
         *  The second template parameter defines the type of the underlying
         *  sequence/container.  It defaults to std::deque, but it can be any type
         *  that supports @c front, @c back, @c push_back, and @c pop_front,
         *  such as std::list or an appropriate user-defined type.
         *
         *  Members not found in @a normal containers are @c container_type,
         *  which is a typedef for the second Sequence parameter, and @c push and
         *  @c pop, which are standard %queue/FIFO operations.
        */
        template<typename _Tp, typename _Sequence = deque<_Tp> >
          class queue
          {
            // concept requirements
            typedef typename _Sequence::value_type _Sequence_value_type;
            __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
            __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept)
            __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
            __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
      
            template<typename _Tp1, typename _Seq1>
              friend bool
              operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
      
            template<typename _Tp1, typename _Seq1>
              friend bool
              operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);
      
          public:
            typedef typename _Sequence::value_type                value_type;
            typedef typename _Sequence::reference                 reference;
            typedef typename _Sequence::const_reference           const_reference;
            typedef typename _Sequence::size_type                 size_type;
            typedef          _Sequence                            container_type;
      
          protected:
            /**
             *  'c' is the underlying container.  Maintainers wondering why
             *  this isn't uglified as per style guidelines should note that
             *  this name is specified in the standard, [23.2.3.1].  (Why?
             *  Presumably for the same reason that it's protected instead
             *  of private: to allow derivation.  But none of the other
             *  containers allow for derivation.  Odd.)
             */
            _Sequence c;
      
          public:
            /**
             *  @brief  Default constructor creates no elements.
             */
      #if __cplusplus < 201103L
            explicit
            queue(const _Sequence& __c = _Sequence())
            : c(__c) { }
      #else
            explicit
            queue(const _Sequence& __c)
            : c(__c) { }
      
            explicit
            queue(_Sequence&& __c = _Sequence())
            : c(std::move(__c)) { }
      #endif
      
            /**
             *  Returns true if the %queue is empty.
             */
            bool
            empty() const
            { return c.empty(); }
      
            /**  Returns the number of elements in the %queue.  */
            size_type
            size() const
            { return c.size(); }
      
            /**
             *  Returns a read/write reference to the data at the first
             *  element of the %queue.
             */
            reference
            front()
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  Returns a read-only (constant) reference to the data at the first
             *  element of the %queue.
             */
            const_reference
            front() const
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  Returns a read/write reference to the data at the last
             *  element of the %queue.
             */
            reference
            back()
            {
      	__glibcxx_requires_nonempty();
      	return c.back();
            }
      
            /**
             *  Returns a read-only (constant) reference to the data at the last
             *  element of the %queue.
             */
            const_reference
            back() const
            {
      	__glibcxx_requires_nonempty();
      	return c.back();
            }
      
            /**
             *  @brief  Add data to the end of the %queue.
             *  @param  __x  Data to be added.
             *
             *  This is a typical %queue operation.  The function creates an
             *  element at the end of the %queue and assigns the given data
             *  to it.  The time complexity of the operation depends on the
             *  underlying sequence.
             */
            void
            push(const value_type& __x)
            { c.push_back(__x); }
      
      #if __cplusplus >= 201103L
            void
            push(value_type&& __x)
            { c.push_back(std::move(__x)); }
      
            template<typename... _Args>
              void
              emplace(_Args&&... __args)
      	{ c.emplace_back(std::forward<_Args>(__args)...); }
      #endif
      
            /**
             *  @brief  Removes first element.
             *
             *  This is a typical %queue operation.  It shrinks the %queue by one.
             *  The time complexity of the operation depends on the underlying
             *  sequence.
             *
             *  Note that no data is returned, and if the first element's
             *  data is needed, it should be retrieved before pop() is
             *  called.
             */
            void
            pop()
            {
      	__glibcxx_requires_nonempty();
      	c.pop_front();
            }
      
      #if __cplusplus >= 201103L
            void
            swap(queue& __q)
            noexcept(noexcept(swap(c, __q.c)))
            {
      	using std::swap;
      	swap(c, __q.c);
            }
      #endif
          };
      
        /**
         *  @brief  Queue equality comparison.
         *  @param  __x  A %queue.
         *  @param  __y  A %queue of the same type as @a __x.
         *  @return  True iff the size and elements of the queues are equal.
         *
         *  This is an equivalence relation.  Complexity and semantics depend on the
         *  underlying sequence type, but the expected rules are:  this relation is
         *  linear in the size of the sequences, and queues are considered equivalent
         *  if their sequences compare equal.
        */
        template<typename _Tp, typename _Seq>
          inline bool
          operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __x.c == __y.c; }
      
        /**
         *  @brief  Queue ordering relation.
         *  @param  __x  A %queue.
         *  @param  __y  A %queue of the same type as @a x.
         *  @return  True iff @a __x is lexicographically less than @a __y.
         *
         *  This is an total ordering relation.  Complexity and semantics
         *  depend on the underlying sequence type, but the expected rules
         *  are: this relation is linear in the size of the sequences, the
         *  elements must be comparable with @c <, and
         *  std::lexicographical_compare() is usually used to make the
         *  determination.
        */
        template<typename _Tp, typename _Seq>
          inline bool
          operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __x.c < __y.c; }
      
        /// Based on operator==
        template<typename _Tp, typename _Seq>
          inline bool
          operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__x == __y); }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return __y < __x; }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__y < __x); }
      
        /// Based on operator<
        template<typename _Tp, typename _Seq>
          inline bool
          operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y)
          { return !(__x < __y); }
      
      #if __cplusplus >= 201103L
        template<typename _Tp, typename _Seq>
          inline void
          swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y)
          noexcept(noexcept(__x.swap(__y)))
          { __x.swap(__y); }
      
        template<typename _Tp, typename _Seq, typename _Alloc>
          struct uses_allocator<queue<_Tp, _Seq>, _Alloc>
          : public uses_allocator<_Seq, _Alloc>::type { };
      #endif
      
        /**
         *  @brief  A standard container automatically sorting its contents.
         *
         *  @ingroup sequences
         *
         *  @tparam _Tp  Type of element.
         *  @tparam _Sequence  Type of underlying sequence, defaults to vector<_Tp>.
         *  @tparam _Compare  Comparison function object type, defaults to 
         *                    less<_Sequence::value_type>.
         *
         *  This is not a true container, but an @e adaptor.  It holds
         *  another container, and provides a wrapper interface to that
         *  container.  The wrapper is what enforces priority-based sorting 
         *  and %queue behavior.  Very few of the standard container/sequence
         *  interface requirements are met (e.g., iterators).
         *
         *  The second template parameter defines the type of the underlying
         *  sequence/container.  It defaults to std::vector, but it can be
         *  any type that supports @c front(), @c push_back, @c pop_back,
         *  and random-access iterators, such as std::deque or an
         *  appropriate user-defined type.
         *
         *  The third template parameter supplies the means of making
         *  priority comparisons.  It defaults to @c less<value_type> but
         *  can be anything defining a strict weak ordering.
         *
         *  Members not found in @a normal containers are @c container_type,
         *  which is a typedef for the second Sequence parameter, and @c
         *  push, @c pop, and @c top, which are standard %queue operations.
         *
         *  @note No equality/comparison operators are provided for
         *  %priority_queue.
         *
         *  @note Sorting of the elements takes place as they are added to,
         *  and removed from, the %priority_queue using the
         *  %priority_queue's member functions.  If you access the elements
         *  by other means, and change their data such that the sorting
         *  order would be different, the %priority_queue will not re-sort
         *  the elements for you.  (How could it know to do so?)
        */
        template<typename _Tp, typename _Sequence = vector<_Tp>,
      	   typename _Compare  = less<typename _Sequence::value_type> >
          class priority_queue
          {
            // concept requirements
            typedef typename _Sequence::value_type _Sequence_value_type;
            __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
            __glibcxx_class_requires(_Sequence, _SequenceConcept)
            __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept)
            __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)
            __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp,
      				_BinaryFunctionConcept)
      
          public:
            typedef typename _Sequence::value_type                value_type;
            typedef typename _Sequence::reference                 reference;
            typedef typename _Sequence::const_reference           const_reference;
            typedef typename _Sequence::size_type                 size_type;
            typedef          _Sequence                            container_type;
      
          protected:
            //  See queue::c for notes on these names.
            _Sequence  c;
            _Compare   comp;
      
          public:
            /**
             *  @brief  Default constructor creates no elements.
             */
      #if __cplusplus < 201103L
            explicit
            priority_queue(const _Compare& __x = _Compare(),
      		     const _Sequence& __s = _Sequence())
            : c(__s), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      #else
            explicit
            priority_queue(const _Compare& __x,
      		     const _Sequence& __s)
            : c(__s), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      
            explicit
            priority_queue(const _Compare& __x = _Compare(),
      		     _Sequence&& __s = _Sequence())
            : c(std::move(__s)), comp(__x)
            { std::make_heap(c.begin(), c.end(), comp); }
      #endif
      
            /**
             *  @brief  Builds a %queue from a range.
             *  @param  __first  An input iterator.
             *  @param  __last  An input iterator.
             *  @param  __x  A comparison functor describing a strict weak ordering.
             *  @param  __s  An initial sequence with which to start.
             *
             *  Begins by copying @a __s, inserting a copy of the elements
             *  from @a [first,last) into the copy of @a __s, then ordering
             *  the copy according to @a __x.
             *
             *  For more information on function objects, see the
             *  documentation on @link functors functor base
             *  classes@endlink.
             */
      #if __cplusplus < 201103L
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x = _Compare(),
      		       const _Sequence& __s = _Sequence())
      	: c(__s), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      #else
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x,
      		       const _Sequence& __s)
      	: c(__s), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      
            template<typename _InputIterator>
              priority_queue(_InputIterator __first, _InputIterator __last,
      		       const _Compare& __x = _Compare(),
      		       _Sequence&& __s = _Sequence())
      	: c(std::move(__s)), comp(__x)
              {
      	  __glibcxx_requires_valid_range(__first, __last);
      	  c.insert(c.end(), __first, __last);
      	  std::make_heap(c.begin(), c.end(), comp);
      	}
      #endif
      
            /**
             *  Returns true if the %queue is empty.
             */
            bool
            empty() const
            { return c.empty(); }
      
            /**  Returns the number of elements in the %queue.  */
            size_type
            size() const
            { return c.size(); }
      
            /**
             *  Returns a read-only (constant) reference to the data at the first
             *  element of the %queue.
             */
            const_reference
            top() const
            {
      	__glibcxx_requires_nonempty();
      	return c.front();
            }
      
            /**
             *  @brief  Add data to the %queue.
             *  @param  __x  Data to be added.
             *
             *  This is a typical %queue operation.
             *  The time complexity of the operation depends on the underlying
             *  sequence.
             */
            void
            push(const value_type& __x)
            {
      	c.push_back(__x);
      	std::push_heap(c.begin(), c.end(), comp);
            }
      
      #if __cplusplus >= 201103L
            void
            push(value_type&& __x)
            {
      	c.push_back(std::move(__x));
      	std::push_heap(c.begin(), c.end(), comp);
            }
      
            template<typename... _Args>
              void
              emplace(_Args&&... __args)
      	{
      	  c.emplace_back(std::forward<_Args>(__args)...);
      	  std::push_heap(c.begin(), c.end(), comp);
      	}
      #endif
      
            /**
             *  @brief  Removes first element.
             *
             *  This is a typical %queue operation.  It shrinks the %queue
             *  by one.  The time complexity of the operation depends on the
             *  underlying sequence.
             *
             *  Note that no data is returned, and if the first element's
             *  data is needed, it should be retrieved before pop() is
             *  called.
             */
            void
            pop()
            {
      	__glibcxx_requires_nonempty();
      	std::pop_heap(c.begin(), c.end(), comp);
      	c.pop_back();
            }
      
      #if __cplusplus >= 201103L
            void
            swap(priority_queue& __pq)
            noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp)))
            {
      	using std::swap;
      	swap(c, __pq.c);
      	swap(comp, __pq.comp);
            }
      #endif
          };
      
        // No equality/comparison operators are provided for priority_queue.
      
      #if __cplusplus >= 201103L
        template<typename _Tp, typename _Sequence, typename _Compare>
          inline void
          swap(priority_queue<_Tp, _Sequence, _Compare>& __x,
      	 priority_queue<_Tp, _Sequence, _Compare>& __y)
          noexcept(noexcept(__x.swap(__y)))
          { __x.swap(__y); }
      
        template<typename _Tp, typename _Sequence, typename _Compare,
      	   typename _Alloc>
          struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc>
          : public uses_allocator<_Sequence, _Alloc>::type { };
      #endif
      
      _GLIBCXX_END_NAMESPACE_VERSION
      } // namespace
      
      #endif /* _STL_QUEUE_H */
      
      • 1
        @ 2026-4-7 18:14:53

        // Queue implementation -- C++ --

        // Copyright (C) 2001-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.

        // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details.

        // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation.

        // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // http://www.gnu.org/licenses/.

        /* *

        • Copyright (c) 1994
        • Hewlett-Packard Company
        • Permission to use, copy, modify, distribute and sell this software
        • and its documentation for any purpose is hereby granted without fee,
        • provided that the above copyright notice appear in all copies and
        • that both that copyright notice and this permission notice appear
        • in supporting documentation. Hewlett-Packard Company makes no
        • representations about the suitability of this software for any
        • purpose. It is provided "as is" without express or implied warranty.
        • Copyright (c) 1996,1997
        • Silicon Graphics Computer Systems, Inc.
        • Permission to use, copy, modify, distribute and sell this software
        • and its documentation for any purpose is hereby granted without fee,
        • provided that the above copyright notice appear in all copies and
        • that both that copyright notice and this permission notice appear
        • in supporting documentation. Silicon Graphics makes no
        • representations about the suitability of this software for any
        • purpose. It is provided "as is" without express or implied warranty. */

        /** @file bits/stl_queue.h

        • This is an internal header file, included by other library headers.
        • Do not attempt to use it directly. @headername{queue} */

        #ifndef _STL_QUEUE_H #define _STL_QUEUE_H 1

        #include <bits/concept_check.h> #include <debug/debug.h>

        namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION

        /**

        • @brief A standard container giving FIFO behavior.

        • @ingroup sequences

        • @tparam _Tp Type of element.

        • @tparam _Sequence Type of underlying sequence, defaults to deque<_Tp>.

        • Meets many of the requirements of a

        • container,

        • but does not define anything to do with iterators. Very few of the

        • other standard container interfaces are defined.

        • This is not a true container, but an @e adaptor. It holds another

        • container, and provides a wrapper interface to that container. The

        • wrapper is what enforces strict first-in-first-out %queue behavior.

        • The second template parameter defines the type of the underlying

        • sequence/container. It defaults to std::deque, but it can be any type

        • that supports @c front, @c back, @c push_back, and @c pop_front,

        • such as std::list or an appropriate user-defined type.

        • Members not found in @a normal containers are @c container_type,

        • which is a typedef for the second Sequence parameter, and @c push and

        • @c pop, which are standard %queue/FIFO operations. */ template<typename _Tp, typename _Sequence = deque<_Tp> > class queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

          template<typename _Tp1, typename _Seq1> friend bool operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

          template<typename _Tp1, typename _Seq1> friend bool operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
        
        protected:
          /**
           *  'c' is the underlying container.  Maintainers wondering why
           *  this isn't uglified as per style guidelines should note that
           *  this name is specified in the standard, [23.2.3.1].  (Why?
           *  Presumably for the same reason that it's protected instead
           *  of private: to allow derivation.  But none of the other
           *  containers allow for derivation.  Odd.)
           */
          _Sequence c;
        
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
        

        #if __cplusplus < 201103L explicit queue(const _Sequence& __c = _Sequence()) : c(__c) { } #else explicit queue(const _Sequence& __c) : c(__c) { }

          explicit
          queue(_Sequence&& __c = _Sequence())
          : c(std::move(__c)) { }
        

        #endif

          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
        
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
        
          /**
           *  Returns a read/write reference to the data at the first
           *  element of the %queue.
           */
          reference
          front()
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          front() const
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  Returns a read/write reference to the data at the last
           *  element of the %queue.
           */
          reference
          back()
          {
        __glibcxx_requires_nonempty();
        return c.back();
          }
        
          /**
           *  Returns a read-only (constant) reference to the data at the last
           *  element of the %queue.
           */
          const_reference
          back() const
          {
        __glibcxx_requires_nonempty();
        return c.back();
          }
        
          /**
           *  @brief  Add data to the end of the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.  The function creates an
           *  element at the end of the %queue and assigns the given data
           *  to it.  The time complexity of the operation depends on the
           *  underlying sequence.
           */
          void
          push(const value_type& __x)
          { c.push_back(__x); }
        

        #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); }

          template<typename... _Args>
            void
            emplace(_Args&&... __args)
        { c.emplace_back(std::forward<_Args>(__args)...); }
        

        #endif

          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue by one.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
        __glibcxx_requires_nonempty();
        c.pop_front();
          }
        

        #if __cplusplus >= 201103L void swap(queue& __q) noexcept(noexcept(swap(c, __q.c))) { using std::swap; swap(c, __q.c); } #endif };

        /**

        • @brief Queue equality comparison.
        • @param __x A %queue.
        • @param __y A %queue of the same type as @a __x.
        • @return True iff the size and elements of the queues are equal.
        • This is an equivalence relation. Complexity and semantics depend on the
        • underlying sequence type, but the expected rules are: this relation is
        • linear in the size of the sequences, and queues are considered equivalent
        • if their sequences compare equal. */ template<typename _Tp, typename _Seq> inline bool operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c == __y.c; }

        /**

        • @brief Queue ordering relation.
        • @param __x A %queue.
        • @param __y A %queue of the same type as @a x.
        • @return True iff @a __x is lexicographically less than @a __y.
        • This is an total ordering relation. Complexity and semantics
        • depend on the underlying sequence type, but the expected rules
        • are: this relation is linear in the size of the sequences, the
        • elements must be comparable with @c <, and
        • std::lexicographical_compare() is usually used to make the
        • determination. */ template<typename _Tp, typename _Seq> inline bool operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c < __y.c; }

        /// Based on operator== template<typename _Tp, typename _Seq> inline bool operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x == __y); }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __y < __x; }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__y < __x); }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x < __y); }

        #if __cplusplus >= 201103L template<typename _Tp, typename _Seq> inline void swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

        template<typename _Tp, typename _Seq, typename _Alloc> struct uses_allocator<queue<_Tp, _Seq>, _Alloc> : public uses_allocator<_Seq, _Alloc>::type { }; #endif

        /**

        • @brief A standard container automatically sorting its contents.
        • @ingroup sequences
        • @tparam _Tp Type of element.
        • @tparam _Sequence Type of underlying sequence, defaults to vector<_Tp>.
        • @tparam _Compare Comparison function object type, defaults to
        •                less<_Sequence::value_type>.
          
        • This is not a true container, but an @e adaptor. It holds
        • another container, and provides a wrapper interface to that
        • container. The wrapper is what enforces priority-based sorting
        • and %queue behavior. Very few of the standard container/sequence
        • interface requirements are met (e.g., iterators).
        • The second template parameter defines the type of the underlying
        • sequence/container. It defaults to std::vector, but it can be
        • any type that supports @c front(), @c push_back, @c pop_back,
        • and random-access iterators, such as std::deque or an
        • appropriate user-defined type.
        • The third template parameter supplies the means of making
        • priority comparisons. It defaults to @c less<value_type> but
        • can be anything defining a strict weak ordering.
        • Members not found in @a normal containers are @c container_type,
        • which is a typedef for the second Sequence parameter, and @c
        • push, @c pop, and @c top, which are standard %queue operations.
        • @note No equality/comparison operators are provided for
        • %priority_queue.
        • @note Sorting of the elements takes place as they are added to,
        • and removed from, the %priority_queue using the
        • %priority_queue's member functions. If you access the elements
        • by other means, and change their data such that the sorting
        • order would be different, the %priority_queue will not re-sort
        • the elements for you. (How could it know to do so?) */ template<typename _Tp, typename _Sequence = vector<_Tp>, typename _Compare = less > class priority_queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _SequenceConcept) __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp, _BinaryFunctionConcept)
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
        
        protected:
          //  See queue::c for notes on these names.
          _Sequence  c;
          _Compare   comp;
        
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
        

        #if __cplusplus < 201103L explicit priority_queue(const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } #else explicit priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); }

          explicit
          priority_queue(const _Compare& __x = _Compare(),
        	     _Sequence&& __s = _Sequence())
          : c(std::move(__s)), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
        

        #endif

          /**
           *  @brief  Builds a %queue from a range.
           *  @param  __first  An input iterator.
           *  @param  __last  An input iterator.
           *  @param  __x  A comparison functor describing a strict weak ordering.
           *  @param  __s  An initial sequence with which to start.
           *
           *  Begins by copying @a __s, inserting a copy of the elements
           *  from @a [first,last) into the copy of @a __s, then ordering
           *  the copy according to @a __x.
           *
           *  For more information on function objects, see the
           *  documentation on @link functors functor base
           *  classes@endlink.
           */
        

        #if __cplusplus < 201103L template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); } #else template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); }

          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
        	       const _Compare& __x = _Compare(),
        	       _Sequence&& __s = _Sequence())
        : c(std::move(__s)), comp(__x)
            {
          __glibcxx_requires_valid_range(__first, __last);
          c.insert(c.end(), __first, __last);
          std::make_heap(c.begin(), c.end(), comp);
        }
        

        #endif

          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
        
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
        
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          top() const
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  @brief  Add data to the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           */
          void
          push(const value_type& __x)
          {
        c.push_back(__x);
        std::push_heap(c.begin(), c.end(), comp);
          }
        

        #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); std::push_heap(c.begin(), c.end(), comp); }

          template<typename... _Args>
            void
            emplace(_Args&&... __args)
        {
          c.emplace_back(std::forward<_Args>(__args)...);
          std::push_heap(c.begin(), c.end(), comp);
        }
        

        #endif

          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue
           *  by one.  The time complexity of the operation depends on the
           *  underlying sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
        __glibcxx_requires_nonempty();
        std::pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
          }
        

        #if __cplusplus >= 201103L void swap(priority_queue& __pq) noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp))) { using std::swap; swap(c, __pq.c); swap(comp, __pq.comp); } #endif };

        // No equality/comparison operators are provided for priority_queue.

        #if __cplusplus >= 201103L template<typename _Tp, typename _Sequence, typename _Compare> inline void swap(priority_queue<_Tp, _Sequence, _Compare>& __x, priority_queue<_Tp, _Sequence, _Compare>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

        template<typename _Tp, typename _Sequence, typename _Compare, typename _Alloc> struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc> : public uses_allocator<_Sequence, _Alloc>::type { }; #endif

        _GLIBCXX_END_NAMESPACE_VERSION } // namespace

        #endif /* _STL_QUEUE_H / // Queue implementation -- C++ -*-

        // Copyright (C) 2001-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.

        // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details.

        // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation.

        // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // http://www.gnu.org/licenses/.

        /* *

        • Copyright (c) 1994
        • Hewlett-Packard Company
        • Permission to use, copy, modify, distribute and sell this software
        • and its documentation for any purpose is hereby granted without fee,
        • provided that the above copyright notice appear in all copies and
        • that both that copyright notice and this permission notice appear
        • in supporting documentation. Hewlett-Packard Company makes no
        • representations about the suitability of this software for any
        • purpose. It is provided "as is" without express or implied warranty.
        • Copyright (c) 1996,1997
        • Silicon Graphics Computer Systems, Inc.
        • Permission to use, copy, modify, distribute and sell this software
        • and its documentation for any purpose is hereby granted without fee,
        • provided that the above copyright notice appear in all copies and
        • that both that copyright notice and this permission notice appear
        • in supporting documentation. Silicon Graphics makes no
        • representations about the suitability of this software for any
        • purpose. It is provided "as is" without express or implied warranty. */

        /** @file bits/stl_queue.h

        • This is an internal header file, included by other library headers.
        • Do not attempt to use it directly. @headername{queue} */

        #ifndef _STL_QUEUE_H #define _STL_QUEUE_H 1

        #include <bits/concept_check.h> #include <debug/debug.h>

        namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION

        /**

        • @brief A standard container giving FIFO behavior.

        • @ingroup sequences

        • @tparam _Tp Type of element.

        • @tparam _Sequence Type of underlying sequence, defaults to deque<_Tp>.

        • Meets many of the requirements of a

        • container,

        • but does not define anything to do with iterators. Very few of the

        • other standard container interfaces are defined.

        • This is not a true container, but an @e adaptor. It holds another

        • container, and provides a wrapper interface to that container. The

        • wrapper is what enforces strict first-in-first-out %queue behavior.

        • The second template parameter defines the type of the underlying

        • sequence/container. It defaults to std::deque, but it can be any type

        • that supports @c front, @c back, @c push_back, and @c pop_front,

        • such as std::list or an appropriate user-defined type.

        • Members not found in @a normal containers are @c container_type,

        • which is a typedef for the second Sequence parameter, and @c push and

        • @c pop, which are standard %queue/FIFO operations. */ template<typename _Tp, typename _Sequence = deque<_Tp> > class queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

          template<typename _Tp1, typename _Seq1> friend bool operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

          template<typename _Tp1, typename _Seq1> friend bool operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
        
        protected:
          /**
           *  'c' is the underlying container.  Maintainers wondering why
           *  this isn't uglified as per style guidelines should note that
           *  this name is specified in the standard, [23.2.3.1].  (Why?
           *  Presumably for the same reason that it's protected instead
           *  of private: to allow derivation.  But none of the other
           *  containers allow for derivation.  Odd.)
           */
          _Sequence c;
        
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
        

        #if __cplusplus < 201103L explicit queue(const _Sequence& __c = _Sequence()) : c(__c) { } #else explicit queue(const _Sequence& __c) : c(__c) { }

          explicit
          queue(_Sequence&& __c = _Sequence())
          : c(std::move(__c)) { }
        

        #endif

          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
        
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
        
          /**
           *  Returns a read/write reference to the data at the first
           *  element of the %queue.
           */
          reference
          front()
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          front() const
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  Returns a read/write reference to the data at the last
           *  element of the %queue.
           */
          reference
          back()
          {
        __glibcxx_requires_nonempty();
        return c.back();
          }
        
          /**
           *  Returns a read-only (constant) reference to the data at the last
           *  element of the %queue.
           */
          const_reference
          back() const
          {
        __glibcxx_requires_nonempty();
        return c.back();
          }
        
          /**
           *  @brief  Add data to the end of the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.  The function creates an
           *  element at the end of the %queue and assigns the given data
           *  to it.  The time complexity of the operation depends on the
           *  underlying sequence.
           */
          void
          push(const value_type& __x)
          { c.push_back(__x); }
        

        #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); }

          template<typename... _Args>
            void
            emplace(_Args&&... __args)
        { c.emplace_back(std::forward<_Args>(__args)...); }
        

        #endif

          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue by one.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
        __glibcxx_requires_nonempty();
        c.pop_front();
          }
        

        #if __cplusplus >= 201103L void swap(queue& __q) noexcept(noexcept(swap(c, __q.c))) { using std::swap; swap(c, __q.c); } #endif };

        /**

        • @brief Queue equality comparison.
        • @param __x A %queue.
        • @param __y A %queue of the same type as @a __x.
        • @return True iff the size and elements of the queues are equal.
        • This is an equivalence relation. Complexity and semantics depend on the
        • underlying sequence type, but the expected rules are: this relation is
        • linear in the size of the sequences, and queues are considered equivalent
        • if their sequences compare equal. */ template<typename _Tp, typename _Seq> inline bool operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c == __y.c; }

        /**

        • @brief Queue ordering relation.
        • @param __x A %queue.
        • @param __y A %queue of the same type as @a x.
        • @return True iff @a __x is lexicographically less than @a __y.
        • This is an total ordering relation. Complexity and semantics
        • depend on the underlying sequence type, but the expected rules
        • are: this relation is linear in the size of the sequences, the
        • elements must be comparable with @c <, and
        • std::lexicographical_compare() is usually used to make the
        • determination. */ template<typename _Tp, typename _Seq> inline bool operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c < __y.c; }

        /// Based on operator== template<typename _Tp, typename _Seq> inline bool operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x == __y); }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __y < __x; }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__y < __x); }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x < __y); }

        #if __cplusplus >= 201103L template<typename _Tp, typename _Seq> inline void swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

        template<typename _Tp, typename _Seq, typename _Alloc> struct uses_allocator<queue<_Tp, _Seq>, _Alloc> : public uses_allocator<_Seq, _Alloc>::type { }; #endif

        /**

        • @brief A standard container automatically sorting its contents.
        • @ingroup sequences
        • @tparam _Tp Type of element.
        • @tparam _Sequence Type of underlying sequence, defaults to vector<_Tp>.
        • @tparam _Compare Comparison function object type, defaults to
        •                less<_Sequence::value_type>.
          
        • This is not a true container, but an @e adaptor. It holds
        • another container, and provides a wrapper interface to that
        • container. The wrapper is what enforces priority-based sorting
        • and %queue behavior. Very few of the standard container/sequence
        • interface requirements are met (e.g., iterators).
        • The second template parameter defines the type of the underlying
        • sequence/container. It defaults to std::vector, but it can be
        • any type that supports @c front(), @c push_back, @c pop_back,
        • and random-access iterators, such as std::deque or an
        • appropriate user-defined type.
        • The third template parameter supplies the means of making
        • priority comparisons. It defaults to @c less<value_type> but
        • can be anything defining a strict weak ordering.
        • Members not found in @a normal containers are @c container_type,
        • which is a typedef for the second Sequence parameter, and @c
        • push, @c pop, and @c top, which are standard %queue operations.
        • @note No equality/comparison operators are provided for
        • %priority_queue.
        • @note Sorting of the elements takes place as they are added to,
        • and removed from, the %priority_queue using the
        • %priority_queue's member functions. If you access the elements
        • by other means, and change their data such that the sorting
        • order would be different, the %priority_queue will not re-sort
        • the elements for you. (How could it know to do so?) */ template<typename _Tp, typename _Sequence = vector<_Tp>, typename _Compare = less > class priority_queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _SequenceConcept) __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp, _BinaryFunctionConcept)
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
        
        protected:
          //  See queue::c for notes on these names.
          _Sequence  c;
          _Compare   comp;
        
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
        

        #if __cplusplus < 201103L explicit priority_queue(const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } #else explicit priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); }

          explicit
          priority_queue(const _Compare& __x = _Compare(),
        	     _Sequence&& __s = _Sequence())
          : c(std::move(__s)), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
        

        #endif

          /**
           *  @brief  Builds a %queue from a range.
           *  @param  __first  An input iterator.
           *  @param  __last  An input iterator.
           *  @param  __x  A comparison functor describing a strict weak ordering.
           *  @param  __s  An initial sequence with which to start.
           *
           *  Begins by copying @a __s, inserting a copy of the elements
           *  from @a [first,last) into the copy of @a __s, then ordering
           *  the copy according to @a __x.
           *
           *  For more information on function objects, see the
           *  documentation on @link functors functor base
           *  classes@endlink.
           */
        

        #if __cplusplus < 201103L template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); } #else template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); }

          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
        	       const _Compare& __x = _Compare(),
        	       _Sequence&& __s = _Sequence())
        : c(std::move(__s)), comp(__x)
            {
          __glibcxx_requires_valid_range(__first, __last);
          c.insert(c.end(), __first, __last);
          std::make_heap(c.begin(), c.end(), comp);
        }
        

        #endif

          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
        
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
        
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          top() const
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  @brief  Add data to the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           */
          void
          push(const value_type& __x)
          {
        c.push_back(__x);
        std::push_heap(c.begin(), c.end(), comp);
          }
        

        #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); std::push_heap(c.begin(), c.end(), comp); }

          template<typename... _Args>
            void
            emplace(_Args&&... __args)
        {
          c.emplace_back(std::forward<_Args>(__args)...);
          std::push_heap(c.begin(), c.end(), comp);
        }
        

        #endif

          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue
           *  by one.  The time complexity of the operation depends on the
           *  underlying sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
        __glibcxx_requires_nonempty();
        std::pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
          }
        

        #if __cplusplus >= 201103L void swap(priority_queue& __pq) noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp))) { using std::swap; swap(c, __pq.c); swap(comp, __pq.comp); } #endif };

        // No equality/comparison operators are provided for priority_queue.

        #if __cplusplus >= 201103L template<typename _Tp, typename _Sequence, typename _Compare> inline void swap(priority_queue<_Tp, _Sequence, _Compare>& __x, priority_queue<_Tp, _Sequence, _Compare>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

        template<typename _Tp, typename _Sequence, typename _Compare, typename _Alloc> struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc> : public uses_allocator<_Sequence, _Alloc>::type { }; #endif

        _GLIBCXX_END_NAMESPACE_VERSION } // namespace

        #endif /* _STL_QUEUE_H / // Queue implementation -- C++ -*-

        // Copyright (C) 2001-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.

        // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details.

        // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation.

        // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // http://www.gnu.org/licenses/.

        /* *

        • Copyright (c) 1994
        • Hewlett-Packard Company
        • Permission to use, copy, modify, distribute and sell this software
        • and its documentation for any purpose is hereby granted without fee,
        • provided that the above copyright notice appear in all copies and
        • that both that copyright notice and this permission notice appear
        • in supporting documentation. Hewlett-Packard Company makes no
        • representations about the suitability of this software for any
        • purpose. It is provided "as is" without express or implied warranty.
        • Copyright (c) 1996,1997
        • Silicon Graphics Computer Systems, Inc.
        • Permission to use, copy, modify, distribute and sell this software
        • and its documentation for any purpose is hereby granted without fee,
        • provided that the above copyright notice appear in all copies and
        • that both that copyright notice and this permission notice appear
        • in supporting documentation. Silicon Graphics makes no
        • representations about the suitability of this software for any
        • purpose. It is provided "as is" without express or implied warranty. */

        /** @file bits/stl_queue.h

        • This is an internal header file, included by other library headers.
        • Do not attempt to use it directly. @headername{queue} */

        #ifndef _STL_QUEUE_H #define _STL_QUEUE_H 1

        #include <bits/concept_check.h> #include <debug/debug.h>

        namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION

        /**

        • @brief A standard container giving FIFO behavior.

        • @ingroup sequences

        • @tparam _Tp Type of element.

        • @tparam _Sequence Type of underlying sequence, defaults to deque<_Tp>.

        • Meets many of the requirements of a

        • container,

        • but does not define anything to do with iterators. Very few of the

        • other standard container interfaces are defined.

        • This is not a true container, but an @e adaptor. It holds another

        • container, and provides a wrapper interface to that container. The

        • wrapper is what enforces strict first-in-first-out %queue behavior.

        • The second template parameter defines the type of the underlying

        • sequence/container. It defaults to std::deque, but it can be any type

        • that supports @c front, @c back, @c push_back, and @c pop_front,

        • such as std::list or an appropriate user-defined type.

        • Members not found in @a normal containers are @c container_type,

        • which is a typedef for the second Sequence parameter, and @c push and

        • @c pop, which are standard %queue/FIFO operations. */ template<typename _Tp, typename _Sequence = deque<_Tp> > class queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

          template<typename _Tp1, typename _Seq1> friend bool operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

          template<typename _Tp1, typename _Seq1> friend bool operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
        
        protected:
          /**
           *  'c' is the underlying container.  Maintainers wondering why
           *  this isn't uglified as per style guidelines should note that
           *  this name is specified in the standard, [23.2.3.1].  (Why?
           *  Presumably for the same reason that it's protected instead
           *  of private: to allow derivation.  But none of the other
           *  containers allow for derivation.  Odd.)
           */
          _Sequence c;
        
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
        

        #if __cplusplus < 201103L explicit queue(const _Sequence& __c = _Sequence()) : c(__c) { } #else explicit queue(const _Sequence& __c) : c(__c) { }

          explicit
          queue(_Sequence&& __c = _Sequence())
          : c(std::move(__c)) { }
        

        #endif

          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
        
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
        
          /**
           *  Returns a read/write reference to the data at the first
           *  element of the %queue.
           */
          reference
          front()
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          front() const
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  Returns a read/write reference to the data at the last
           *  element of the %queue.
           */
          reference
          back()
          {
        __glibcxx_requires_nonempty();
        return c.back();
          }
        
          /**
           *  Returns a read-only (constant) reference to the data at the last
           *  element of the %queue.
           */
          const_reference
          back() const
          {
        __glibcxx_requires_nonempty();
        return c.back();
          }
        
          /**
           *  @brief  Add data to the end of the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.  The function creates an
           *  element at the end of the %queue and assigns the given data
           *  to it.  The time complexity of the operation depends on the
           *  underlying sequence.
           */
          void
          push(const value_type& __x)
          { c.push_back(__x); }
        

        #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); }

          template<typename... _Args>
            void
            emplace(_Args&&... __args)
        { c.emplace_back(std::forward<_Args>(__args)...); }
        

        #endif

          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue by one.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
        __glibcxx_requires_nonempty();
        c.pop_front();
          }
        

        #if __cplusplus >= 201103L void swap(queue& __q) noexcept(noexcept(swap(c, __q.c))) { using std::swap; swap(c, __q.c); } #endif };

        /**

        • @brief Queue equality comparison.
        • @param __x A %queue.
        • @param __y A %queue of the same type as @a __x.
        • @return True iff the size and elements of the queues are equal.
        • This is an equivalence relation. Complexity and semantics depend on the
        • underlying sequence type, but the expected rules are: this relation is
        • linear in the size of the sequences, and queues are considered equivalent
        • if their sequences compare equal. */ template<typename _Tp, typename _Seq> inline bool operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c == __y.c; }

        /**

        • @brief Queue ordering relation.
        • @param __x A %queue.
        • @param __y A %queue of the same type as @a x.
        • @return True iff @a __x is lexicographically less than @a __y.
        • This is an total ordering relation. Complexity and semantics
        • depend on the underlying sequence type, but the expected rules
        • are: this relation is linear in the size of the sequences, the
        • elements must be comparable with @c <, and
        • std::lexicographical_compare() is usually used to make the
        • determination. */ template<typename _Tp, typename _Seq> inline bool operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c < __y.c; }

        /// Based on operator== template<typename _Tp, typename _Seq> inline bool operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x == __y); }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __y < __x; }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__y < __x); }

        /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x < __y); }

        #if __cplusplus >= 201103L template<typename _Tp, typename _Seq> inline void swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

        template<typename _Tp, typename _Seq, typename _Alloc> struct uses_allocator<queue<_Tp, _Seq>, _Alloc> : public uses_allocator<_Seq, _Alloc>::type { }; #endif

        /**

        • @brief A standard container automatically sorting its contents.
        • @ingroup sequences
        • @tparam _Tp Type of element.
        • @tparam _Sequence Type of underlying sequence, defaults to vector<_Tp>.
        • @tparam _Compare Comparison function object type, defaults to
        •                less<_Sequence::value_type>.
          
        • This is not a true container, but an @e adaptor. It holds
        • another container, and provides a wrapper interface to that
        • container. The wrapper is what enforces priority-based sorting
        • and %queue behavior. Very few of the standard container/sequence
        • interface requirements are met (e.g., iterators).
        • The second template parameter defines the type of the underlying
        • sequence/container. It defaults to std::vector, but it can be
        • any type that supports @c front(), @c push_back, @c pop_back,
        • and random-access iterators, such as std::deque or an
        • appropriate user-defined type.
        • The third template parameter supplies the means of making
        • priority comparisons. It defaults to @c less<value_type> but
        • can be anything defining a strict weak ordering.
        • Members not found in @a normal containers are @c container_type,
        • which is a typedef for the second Sequence parameter, and @c
        • push, @c pop, and @c top, which are standard %queue operations.
        • @note No equality/comparison operators are provided for
        • %priority_queue.
        • @note Sorting of the elements takes place as they are added to,
        • and removed from, the %priority_queue using the
        • %priority_queue's member functions. If you access the elements
        • by other means, and change their data such that the sorting
        • order would be different, the %priority_queue will not re-sort
        • the elements for you. (How could it know to do so?) */ template<typename _Tp, typename _Sequence = vector<_Tp>, typename _Compare = less > class priority_queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _SequenceConcept) __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp, _BinaryFunctionConcept)
        public:
          typedef typename _Sequence::value_type                value_type;
          typedef typename _Sequence::reference                 reference;
          typedef typename _Sequence::const_reference           const_reference;
          typedef typename _Sequence::size_type                 size_type;
          typedef          _Sequence                            container_type;
        
        protected:
          //  See queue::c for notes on these names.
          _Sequence  c;
          _Compare   comp;
        
        public:
          /**
           *  @brief  Default constructor creates no elements.
           */
        

        #if __cplusplus < 201103L explicit priority_queue(const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } #else explicit priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); }

          explicit
          priority_queue(const _Compare& __x = _Compare(),
        	     _Sequence&& __s = _Sequence())
          : c(std::move(__s)), comp(__x)
          { std::make_heap(c.begin(), c.end(), comp); }
        

        #endif

          /**
           *  @brief  Builds a %queue from a range.
           *  @param  __first  An input iterator.
           *  @param  __last  An input iterator.
           *  @param  __x  A comparison functor describing a strict weak ordering.
           *  @param  __s  An initial sequence with which to start.
           *
           *  Begins by copying @a __s, inserting a copy of the elements
           *  from @a [first,last) into the copy of @a __s, then ordering
           *  the copy according to @a __x.
           *
           *  For more information on function objects, see the
           *  documentation on @link functors functor base
           *  classes@endlink.
           */
        

        #if __cplusplus < 201103L template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); } #else template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); }

          template<typename _InputIterator>
            priority_queue(_InputIterator __first, _InputIterator __last,
        	       const _Compare& __x = _Compare(),
        	       _Sequence&& __s = _Sequence())
        : c(std::move(__s)), comp(__x)
            {
          __glibcxx_requires_valid_range(__first, __last);
          c.insert(c.end(), __first, __last);
          std::make_heap(c.begin(), c.end(), comp);
        }
        

        #endif

          /**
           *  Returns true if the %queue is empty.
           */
          bool
          empty() const
          { return c.empty(); }
        
          /**  Returns the number of elements in the %queue.  */
          size_type
          size() const
          { return c.size(); }
        
          /**
           *  Returns a read-only (constant) reference to the data at the first
           *  element of the %queue.
           */
          const_reference
          top() const
          {
        __glibcxx_requires_nonempty();
        return c.front();
          }
        
          /**
           *  @brief  Add data to the %queue.
           *  @param  __x  Data to be added.
           *
           *  This is a typical %queue operation.
           *  The time complexity of the operation depends on the underlying
           *  sequence.
           */
          void
          push(const value_type& __x)
          {
        c.push_back(__x);
        std::push_heap(c.begin(), c.end(), comp);
          }
        

        #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); std::push_heap(c.begin(), c.end(), comp); }

          template<typename... _Args>
            void
            emplace(_Args&&... __args)
        {
          c.emplace_back(std::forward<_Args>(__args)...);
          std::push_heap(c.begin(), c.end(), comp);
        }
        

        #endif

          /**
           *  @brief  Removes first element.
           *
           *  This is a typical %queue operation.  It shrinks the %queue
           *  by one.  The time complexity of the operation depends on the
           *  underlying sequence.
           *
           *  Note that no data is returned, and if the first element's
           *  data is needed, it should be retrieved before pop() is
           *  called.
           */
          void
          pop()
          {
        __glibcxx_requires_nonempty();
        std::pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
          }
        

        #if __cplusplus >= 201103L void swap(priority_queue& __pq) noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp))) { using std::swap; swap(c, __pq.c); swap(comp, __pq.comp); } #endif };

        // No equality/comparison operators are provided for priority_queue.

        #if __cplusplus >= 201103L template<typename _Tp, typename _Sequence, typename _Compare> inline void swap(priority_queue<_Tp, _Sequence, _Compare>& __x, priority_queue<_Tp, _Sequence, _Compare>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

        template<typename _Tp, typename _Sequence, typename _Compare, typename _Alloc> struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc> : public uses_allocator<_Sequence, _Alloc>::type { }; #endif

        _GLIBCXX_END_NAMESPACE_VERSION } // namespace

        #endif /* _STL_QUEUE_H */

        • 0
          @ 2026-4-8 18:11:31

          #include #include using namespace std;

          // 偏移量:上、右、下、左 const int dx[] = {-1, 0, 1, 0}; const int dy[] = {0, 1, 0, -1}; // 每个方向下一步能转的方向(90度) const int next_dir[4][2] = {{1,3}, {0,2}, {1,3}, {0,2}};

          // dp[k][x][y][d]:k步,坐标(x,y),方向d // 坐标偏移1000,避免负数(n最大1000,坐标范围-1000~1000) bool dp[1005][2005][2005][4]; int n;

          int main() { cin >> n;

          // 初始化:0步在原点,4个方向都合法
          for (int d = 0; d < 4; d++) {
              dp[0][1000][1000][d] = true;
          }
          
          // 动态规划转移
          for (int k = 0; k < n; k++) {
              for (int x = 0; x <= 2000; x++) {
                  for (int y = 0; y <= 2000; y++) {
                      for (int d = 0; d < 4; d++) {
                          if (dp[k][x][y][d]) {
                              // 尝试两个旋转后的方向
                              for (int nd : next_dir[d]) {
                                  int nx = x + dx[nd];
                                  int ny = y + dy[nd];
                                  dp[k+1][nx][ny][nd] = true;
                              }
                          }
                      }
                  }
              }
          }
          
          // 统计答案:n步后所有可达坐标
          int ans = 0;
          for (int x = 0; x <= 2000; x++) {
              for (int y = 0; y <= 2000; y++) {
                  bool ok = false;
                  for (int d = 0; d < 4; d++) {
                      if (dp[n][x][y][d]) {
                          ok = true;
                          break;
                      }
                  }
                  if (ok) ans++;
              }
          }
          
          cout << ans << endl;
          return 0;
          

          }

          • 0
            @ 2026-4-7 18:15:07

            // Queue implementation -- C++ --

            // Copyright (C) 2001-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.

            // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details.

            // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation.

            // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // http://www.gnu.org/licenses/.

            /* *

            • Copyright (c) 1994
            • Hewlett-Packard Company
            • Permission to use, copy, modify, distribute and sell this software
            • and its documentation for any purpose is hereby granted without fee,
            • provided that the above copyright notice appear in all copies and
            • that both that copyright notice and this permission notice appear
            • in supporting documentation. Hewlett-Packard Company makes no
            • representations about the suitability of this software for any
            • purpose. It is provided "as is" without express or implied warranty.
            • Copyright (c) 1996,1997
            • Silicon Graphics Computer Systems, Inc.
            • Permission to use, copy, modify, distribute and sell this software
            • and its documentation for any purpose is hereby granted without fee,
            • provided that the above copyright notice appear in all copies and
            • that both that copyright notice and this permission notice appear
            • in supporting documentation. Silicon Graphics makes no
            • representations about the suitability of this software for any
            • purpose. It is provided "as is" without express or implied warranty. */

            /** @file bits/stl_queue.h

            • This is an internal header file, included by other library headers.
            • Do not attempt to use it directly. @headername{queue} */

            #ifndef _STL_QUEUE_H #define _STL_QUEUE_H 1

            #include <bits/concept_check.h> #include <debug/debug.h>

            namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION

            /**

            • @brief A standard container giving FIFO behavior.

            • @ingroup sequences

            • @tparam _Tp Type of element.

            • @tparam _Sequence Type of underlying sequence, defaults to deque<_Tp>.

            • Meets many of the requirements of a

            • container,

            • but does not define anything to do with iterators. Very few of the

            • other standard container interfaces are defined.

            • This is not a true container, but an @e adaptor. It holds another

            • container, and provides a wrapper interface to that container. The

            • wrapper is what enforces strict first-in-first-out %queue behavior.

            • The second template parameter defines the type of the underlying

            • sequence/container. It defaults to std::deque, but it can be any type

            • that supports @c front, @c back, @c push_back, and @c pop_front,

            • such as std::list or an appropriate user-defined type.

            • Members not found in @a normal containers are @c container_type,

            • which is a typedef for the second Sequence parameter, and @c push and

            • @c pop, which are standard %queue/FIFO operations. */ template<typename _Tp, typename _Sequence = deque<_Tp> > class queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

              template<typename _Tp1, typename _Seq1> friend bool operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

              template<typename _Tp1, typename _Seq1> friend bool operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

            public:
              typedef typename _Sequence::value_type                value_type;
              typedef typename _Sequence::reference                 reference;
              typedef typename _Sequence::const_reference           const_reference;
              typedef typename _Sequence::size_type                 size_type;
              typedef          _Sequence                            container_type;
            
            protected:
              /**
               *  'c' is the underlying container.  Maintainers wondering why
               *  this isn't uglified as per style guidelines should note that
               *  this name is specified in the standard, [23.2.3.1].  (Why?
               *  Presumably for the same reason that it's protected instead
               *  of private: to allow derivation.  But none of the other
               *  containers allow for derivation.  Odd.)
               */
              _Sequence c;
            
            public:
              /**
               *  @brief  Default constructor creates no elements.
               */
            

            #if __cplusplus < 201103L explicit queue(const _Sequence& __c = _Sequence()) : c(__c) { } #else explicit queue(const _Sequence& __c) : c(__c) { }

              explicit
              queue(_Sequence&& __c = _Sequence())
              : c(std::move(__c)) { }
            

            #endif

              /**
               *  Returns true if the %queue is empty.
               */
              bool
              empty() const
              { return c.empty(); }
            
              /**  Returns the number of elements in the %queue.  */
              size_type
              size() const
              { return c.size(); }
            
              /**
               *  Returns a read/write reference to the data at the first
               *  element of the %queue.
               */
              reference
              front()
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  Returns a read-only (constant) reference to the data at the first
               *  element of the %queue.
               */
              const_reference
              front() const
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  Returns a read/write reference to the data at the last
               *  element of the %queue.
               */
              reference
              back()
              {
            __glibcxx_requires_nonempty();
            return c.back();
              }
            
              /**
               *  Returns a read-only (constant) reference to the data at the last
               *  element of the %queue.
               */
              const_reference
              back() const
              {
            __glibcxx_requires_nonempty();
            return c.back();
              }
            
              /**
               *  @brief  Add data to the end of the %queue.
               *  @param  __x  Data to be added.
               *
               *  This is a typical %queue operation.  The function creates an
               *  element at the end of the %queue and assigns the given data
               *  to it.  The time complexity of the operation depends on the
               *  underlying sequence.
               */
              void
              push(const value_type& __x)
              { c.push_back(__x); }
            

            #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); }

              template<typename... _Args>
                void
                emplace(_Args&&... __args)
            { c.emplace_back(std::forward<_Args>(__args)...); }
            

            #endif

              /**
               *  @brief  Removes first element.
               *
               *  This is a typical %queue operation.  It shrinks the %queue by one.
               *  The time complexity of the operation depends on the underlying
               *  sequence.
               *
               *  Note that no data is returned, and if the first element's
               *  data is needed, it should be retrieved before pop() is
               *  called.
               */
              void
              pop()
              {
            __glibcxx_requires_nonempty();
            c.pop_front();
              }
            

            #if __cplusplus >= 201103L void swap(queue& __q) noexcept(noexcept(swap(c, __q.c))) { using std::swap; swap(c, __q.c); } #endif };

            /**

            • @brief Queue equality comparison.
            • @param __x A %queue.
            • @param __y A %queue of the same type as @a __x.
            • @return True iff the size and elements of the queues are equal.
            • This is an equivalence relation. Complexity and semantics depend on the
            • underlying sequence type, but the expected rules are: this relation is
            • linear in the size of the sequences, and queues are considered equivalent
            • if their sequences compare equal. */ template<typename _Tp, typename _Seq> inline bool operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c == __y.c; }

            /**

            • @brief Queue ordering relation.
            • @param __x A %queue.
            • @param __y A %queue of the same type as @a x.
            • @return True iff @a __x is lexicographically less than @a __y.
            • This is an total ordering relation. Complexity and semantics
            • depend on the underlying sequence type, but the expected rules
            • are: this relation is linear in the size of the sequences, the
            • elements must be comparable with @c <, and
            • std::lexicographical_compare() is usually used to make the
            • determination. */ template<typename _Tp, typename _Seq> inline bool operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c < __y.c; }

            /// Based on operator== template<typename _Tp, typename _Seq> inline bool operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x == __y); }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __y < __x; }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__y < __x); }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x < __y); }

            #if __cplusplus >= 201103L template<typename _Tp, typename _Seq> inline void swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

            template<typename _Tp, typename _Seq, typename _Alloc> struct uses_allocator<queue<_Tp, _Seq>, _Alloc> : public uses_allocator<_Seq, _Alloc>::type { }; #endif

            /**

            • @brief A standard container automatically sorting its contents.
            • @ingroup sequences
            • @tparam _Tp Type of element.
            • @tparam _Sequence Type of underlying sequence, defaults to vector<_Tp>.
            • @tparam _Compare Comparison function object type, defaults to
            •                less<_Sequence::value_type>.
              
            • This is not a true container, but an @e adaptor. It holds
            • another container, and provides a wrapper interface to that
            • container. The wrapper is what enforces priority-based sorting
            • and %queue behavior. Very few of the standard container/sequence
            • interface requirements are met (e.g., iterators).
            • The second template parameter defines the type of the underlying
            • sequence/container. It defaults to std::vector, but it can be
            • any type that supports @c front(), @c push_back, @c pop_back,
            • and random-access iterators, such as std::deque or an
            • appropriate user-defined type.
            • The third template parameter supplies the means of making
            • priority comparisons. It defaults to @c less<value_type> but
            • can be anything defining a strict weak ordering.
            • Members not found in @a normal containers are @c container_type,
            • which is a typedef for the second Sequence parameter, and @c
            • push, @c pop, and @c top, which are standard %queue operations.
            • @note No equality/comparison operators are provided for
            • %priority_queue.
            • @note Sorting of the elements takes place as they are added to,
            • and removed from, the %priority_queue using the
            • %priority_queue's member functions. If you access the elements
            • by other means, and change their data such that the sorting
            • order would be different, the %priority_queue will not re-sort
            • the elements for you. (How could it know to do so?) */ template<typename _Tp, typename _Sequence = vector<_Tp>, typename _Compare = less > class priority_queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _SequenceConcept) __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp, _BinaryFunctionConcept)
            public:
              typedef typename _Sequence::value_type                value_type;
              typedef typename _Sequence::reference                 reference;
              typedef typename _Sequence::const_reference           const_reference;
              typedef typename _Sequence::size_type                 size_type;
              typedef          _Sequence                            container_type;
            
            protected:
              //  See queue::c for notes on these names.
              _Sequence  c;
              _Compare   comp;
            
            public:
              /**
               *  @brief  Default constructor creates no elements.
               */
            

            #if __cplusplus < 201103L explicit priority_queue(const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } #else explicit priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); }

              explicit
              priority_queue(const _Compare& __x = _Compare(),
            	     _Sequence&& __s = _Sequence())
              : c(std::move(__s)), comp(__x)
              { std::make_heap(c.begin(), c.end(), comp); }
            

            #endif

              /**
               *  @brief  Builds a %queue from a range.
               *  @param  __first  An input iterator.
               *  @param  __last  An input iterator.
               *  @param  __x  A comparison functor describing a strict weak ordering.
               *  @param  __s  An initial sequence with which to start.
               *
               *  Begins by copying @a __s, inserting a copy of the elements
               *  from @a [first,last) into the copy of @a __s, then ordering
               *  the copy according to @a __x.
               *
               *  For more information on function objects, see the
               *  documentation on @link functors functor base
               *  classes@endlink.
               */
            

            #if __cplusplus < 201103L template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); } #else template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); }

              template<typename _InputIterator>
                priority_queue(_InputIterator __first, _InputIterator __last,
            	       const _Compare& __x = _Compare(),
            	       _Sequence&& __s = _Sequence())
            : c(std::move(__s)), comp(__x)
                {
              __glibcxx_requires_valid_range(__first, __last);
              c.insert(c.end(), __first, __last);
              std::make_heap(c.begin(), c.end(), comp);
            }
            

            #endif

              /**
               *  Returns true if the %queue is empty.
               */
              bool
              empty() const
              { return c.empty(); }
            
              /**  Returns the number of elements in the %queue.  */
              size_type
              size() const
              { return c.size(); }
            
              /**
               *  Returns a read-only (constant) reference to the data at the first
               *  element of the %queue.
               */
              const_reference
              top() const
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  @brief  Add data to the %queue.
               *  @param  __x  Data to be added.
               *
               *  This is a typical %queue operation.
               *  The time complexity of the operation depends on the underlying
               *  sequence.
               */
              void
              push(const value_type& __x)
              {
            c.push_back(__x);
            std::push_heap(c.begin(), c.end(), comp);
              }
            

            #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); std::push_heap(c.begin(), c.end(), comp); }

              template<typename... _Args>
                void
                emplace(_Args&&... __args)
            {
              c.emplace_back(std::forward<_Args>(__args)...);
              std::push_heap(c.begin(), c.end(), comp);
            }
            

            #endif

              /**
               *  @brief  Removes first element.
               *
               *  This is a typical %queue operation.  It shrinks the %queue
               *  by one.  The time complexity of the operation depends on the
               *  underlying sequence.
               *
               *  Note that no data is returned, and if the first element's
               *  data is needed, it should be retrieved before pop() is
               *  called.
               */
              void
              pop()
              {
            __glibcxx_requires_nonempty();
            std::pop_heap(c.begin(), c.end(), comp);
            c.pop_back();
              }
            

            #if __cplusplus >= 201103L void swap(priority_queue& __pq) noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp))) { using std::swap; swap(c, __pq.c); swap(comp, __pq.comp); } #endif };

            // No equality/comparison operators are provided for priority_queue.

            #if __cplusplus >= 201103L template<typename _Tp, typename _Sequence, typename _Compare> inline void swap(priority_queue<_Tp, _Sequence, _Compare>& __x, priority_queue<_Tp, _Sequence, _Compare>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

            template<typename _Tp, typename _Sequence, typename _Compare, typename _Alloc> struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc> : public uses_allocator<_Sequence, _Alloc>::type { }; #endif

            _GLIBCXX_END_NAMESPACE_VERSION } // namespace

            #endif /* _STL_QUEUE_H / // Queue implementation -- C++ -*-

            // Copyright (C) 2001-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.

            // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details.

            // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation.

            // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // http://www.gnu.org/licenses/.

            /* *

            • Copyright (c) 1994
            • Hewlett-Packard Company
            • Permission to use, copy, modify, distribute and sell this software
            • and its documentation for any purpose is hereby granted without fee,
            • provided that the above copyright notice appear in all copies and
            • that both that copyright notice and this permission notice appear
            • in supporting documentation. Hewlett-Packard Company makes no
            • representations about the suitability of this software for any
            • purpose. It is provided "as is" without express or implied warranty.
            • Copyright (c) 1996,1997
            • Silicon Graphics Computer Systems, Inc.
            • Permission to use, copy, modify, distribute and sell this software
            • and its documentation for any purpose is hereby granted without fee,
            • provided that the above copyright notice appear in all copies and
            • that both that copyright notice and this permission notice appear
            • in supporting documentation. Silicon Graphics makes no
            • representations about the suitability of this software for any
            • purpose. It is provided "as is" without express or implied warranty. */

            /** @file bits/stl_queue.h

            • This is an internal header file, included by other library headers.
            • Do not attempt to use it directly. @headername{queue} */

            #ifndef _STL_QUEUE_H #define _STL_QUEUE_H 1

            #include <bits/concept_check.h> #include <debug/debug.h>

            namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION

            /**

            • @brief A standard container giving FIFO behavior.

            • @ingroup sequences

            • @tparam _Tp Type of element.

            • @tparam _Sequence Type of underlying sequence, defaults to deque<_Tp>.

            • Meets many of the requirements of a

            • container,

            • but does not define anything to do with iterators. Very few of the

            • other standard container interfaces are defined.

            • This is not a true container, but an @e adaptor. It holds another

            • container, and provides a wrapper interface to that container. The

            • wrapper is what enforces strict first-in-first-out %queue behavior.

            • The second template parameter defines the type of the underlying

            • sequence/container. It defaults to std::deque, but it can be any type

            • that supports @c front, @c back, @c push_back, and @c pop_front,

            • such as std::list or an appropriate user-defined type.

            • Members not found in @a normal containers are @c container_type,

            • which is a typedef for the second Sequence parameter, and @c push and

            • @c pop, which are standard %queue/FIFO operations. */ template<typename _Tp, typename _Sequence = deque<_Tp> > class queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

              template<typename _Tp1, typename _Seq1> friend bool operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

              template<typename _Tp1, typename _Seq1> friend bool operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

            public:
              typedef typename _Sequence::value_type                value_type;
              typedef typename _Sequence::reference                 reference;
              typedef typename _Sequence::const_reference           const_reference;
              typedef typename _Sequence::size_type                 size_type;
              typedef          _Sequence                            container_type;
            
            protected:
              /**
               *  'c' is the underlying container.  Maintainers wondering why
               *  this isn't uglified as per style guidelines should note that
               *  this name is specified in the standard, [23.2.3.1].  (Why?
               *  Presumably for the same reason that it's protected instead
               *  of private: to allow derivation.  But none of the other
               *  containers allow for derivation.  Odd.)
               */
              _Sequence c;
            
            public:
              /**
               *  @brief  Default constructor creates no elements.
               */
            

            #if __cplusplus < 201103L explicit queue(const _Sequence& __c = _Sequence()) : c(__c) { } #else explicit queue(const _Sequence& __c) : c(__c) { }

              explicit
              queue(_Sequence&& __c = _Sequence())
              : c(std::move(__c)) { }
            

            #endif

              /**
               *  Returns true if the %queue is empty.
               */
              bool
              empty() const
              { return c.empty(); }
            
              /**  Returns the number of elements in the %queue.  */
              size_type
              size() const
              { return c.size(); }
            
              /**
               *  Returns a read/write reference to the data at the first
               *  element of the %queue.
               */
              reference
              front()
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  Returns a read-only (constant) reference to the data at the first
               *  element of the %queue.
               */
              const_reference
              front() const
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  Returns a read/write reference to the data at the last
               *  element of the %queue.
               */
              reference
              back()
              {
            __glibcxx_requires_nonempty();
            return c.back();
              }
            
              /**
               *  Returns a read-only (constant) reference to the data at the last
               *  element of the %queue.
               */
              const_reference
              back() const
              {
            __glibcxx_requires_nonempty();
            return c.back();
              }
            
              /**
               *  @brief  Add data to the end of the %queue.
               *  @param  __x  Data to be added.
               *
               *  This is a typical %queue operation.  The function creates an
               *  element at the end of the %queue and assigns the given data
               *  to it.  The time complexity of the operation depends on the
               *  underlying sequence.
               */
              void
              push(const value_type& __x)
              { c.push_back(__x); }
            

            #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); }

              template<typename... _Args>
                void
                emplace(_Args&&... __args)
            { c.emplace_back(std::forward<_Args>(__args)...); }
            

            #endif

              /**
               *  @brief  Removes first element.
               *
               *  This is a typical %queue operation.  It shrinks the %queue by one.
               *  The time complexity of the operation depends on the underlying
               *  sequence.
               *
               *  Note that no data is returned, and if the first element's
               *  data is needed, it should be retrieved before pop() is
               *  called.
               */
              void
              pop()
              {
            __glibcxx_requires_nonempty();
            c.pop_front();
              }
            

            #if __cplusplus >= 201103L void swap(queue& __q) noexcept(noexcept(swap(c, __q.c))) { using std::swap; swap(c, __q.c); } #endif };

            /**

            • @brief Queue equality comparison.
            • @param __x A %queue.
            • @param __y A %queue of the same type as @a __x.
            • @return True iff the size and elements of the queues are equal.
            • This is an equivalence relation. Complexity and semantics depend on the
            • underlying sequence type, but the expected rules are: this relation is
            • linear in the size of the sequences, and queues are considered equivalent
            • if their sequences compare equal. */ template<typename _Tp, typename _Seq> inline bool operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c == __y.c; }

            /**

            • @brief Queue ordering relation.
            • @param __x A %queue.
            • @param __y A %queue of the same type as @a x.
            • @return True iff @a __x is lexicographically less than @a __y.
            • This is an total ordering relation. Complexity and semantics
            • depend on the underlying sequence type, but the expected rules
            • are: this relation is linear in the size of the sequences, the
            • elements must be comparable with @c <, and
            • std::lexicographical_compare() is usually used to make the
            • determination. */ template<typename _Tp, typename _Seq> inline bool operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c < __y.c; }

            /// Based on operator== template<typename _Tp, typename _Seq> inline bool operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x == __y); }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __y < __x; }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__y < __x); }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x < __y); }

            #if __cplusplus >= 201103L template<typename _Tp, typename _Seq> inline void swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

            template<typename _Tp, typename _Seq, typename _Alloc> struct uses_allocator<queue<_Tp, _Seq>, _Alloc> : public uses_allocator<_Seq, _Alloc>::type { }; #endif

            /**

            • @brief A standard container automatically sorting its contents.
            • @ingroup sequences
            • @tparam _Tp Type of element.
            • @tparam _Sequence Type of underlying sequence, defaults to vector<_Tp>.
            • @tparam _Compare Comparison function object type, defaults to
            •                less<_Sequence::value_type>.
              
            • This is not a true container, but an @e adaptor. It holds
            • another container, and provides a wrapper interface to that
            • container. The wrapper is what enforces priority-based sorting
            • and %queue behavior. Very few of the standard container/sequence
            • interface requirements are met (e.g., iterators).
            • The second template parameter defines the type of the underlying
            • sequence/container. It defaults to std::vector, but it can be
            • any type that supports @c front(), @c push_back, @c pop_back,
            • and random-access iterators, such as std::deque or an
            • appropriate user-defined type.
            • The third template parameter supplies the means of making
            • priority comparisons. It defaults to @c less<value_type> but
            • can be anything defining a strict weak ordering.
            • Members not found in @a normal containers are @c container_type,
            • which is a typedef for the second Sequence parameter, and @c
            • push, @c pop, and @c top, which are standard %queue operations.
            • @note No equality/comparison operators are provided for
            • %priority_queue.
            • @note Sorting of the elements takes place as they are added to,
            • and removed from, the %priority_queue using the
            • %priority_queue's member functions. If you access the elements
            • by other means, and change their data such that the sorting
            • order would be different, the %priority_queue will not re-sort
            • the elements for you. (How could it know to do so?) */ template<typename _Tp, typename _Sequence = vector<_Tp>, typename _Compare = less > class priority_queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _SequenceConcept) __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp, _BinaryFunctionConcept)
            public:
              typedef typename _Sequence::value_type                value_type;
              typedef typename _Sequence::reference                 reference;
              typedef typename _Sequence::const_reference           const_reference;
              typedef typename _Sequence::size_type                 size_type;
              typedef          _Sequence                            container_type;
            
            protected:
              //  See queue::c for notes on these names.
              _Sequence  c;
              _Compare   comp;
            
            public:
              /**
               *  @brief  Default constructor creates no elements.
               */
            

            #if __cplusplus < 201103L explicit priority_queue(const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } #else explicit priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); }

              explicit
              priority_queue(const _Compare& __x = _Compare(),
            	     _Sequence&& __s = _Sequence())
              : c(std::move(__s)), comp(__x)
              { std::make_heap(c.begin(), c.end(), comp); }
            

            #endif

              /**
               *  @brief  Builds a %queue from a range.
               *  @param  __first  An input iterator.
               *  @param  __last  An input iterator.
               *  @param  __x  A comparison functor describing a strict weak ordering.
               *  @param  __s  An initial sequence with which to start.
               *
               *  Begins by copying @a __s, inserting a copy of the elements
               *  from @a [first,last) into the copy of @a __s, then ordering
               *  the copy according to @a __x.
               *
               *  For more information on function objects, see the
               *  documentation on @link functors functor base
               *  classes@endlink.
               */
            

            #if __cplusplus < 201103L template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); } #else template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); }

              template<typename _InputIterator>
                priority_queue(_InputIterator __first, _InputIterator __last,
            	       const _Compare& __x = _Compare(),
            	       _Sequence&& __s = _Sequence())
            : c(std::move(__s)), comp(__x)
                {
              __glibcxx_requires_valid_range(__first, __last);
              c.insert(c.end(), __first, __last);
              std::make_heap(c.begin(), c.end(), comp);
            }
            

            #endif

              /**
               *  Returns true if the %queue is empty.
               */
              bool
              empty() const
              { return c.empty(); }
            
              /**  Returns the number of elements in the %queue.  */
              size_type
              size() const
              { return c.size(); }
            
              /**
               *  Returns a read-only (constant) reference to the data at the first
               *  element of the %queue.
               */
              const_reference
              top() const
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  @brief  Add data to the %queue.
               *  @param  __x  Data to be added.
               *
               *  This is a typical %queue operation.
               *  The time complexity of the operation depends on the underlying
               *  sequence.
               */
              void
              push(const value_type& __x)
              {
            c.push_back(__x);
            std::push_heap(c.begin(), c.end(), comp);
              }
            

            #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); std::push_heap(c.begin(), c.end(), comp); }

              template<typename... _Args>
                void
                emplace(_Args&&... __args)
            {
              c.emplace_back(std::forward<_Args>(__args)...);
              std::push_heap(c.begin(), c.end(), comp);
            }
            

            #endif

              /**
               *  @brief  Removes first element.
               *
               *  This is a typical %queue operation.  It shrinks the %queue
               *  by one.  The time complexity of the operation depends on the
               *  underlying sequence.
               *
               *  Note that no data is returned, and if the first element's
               *  data is needed, it should be retrieved before pop() is
               *  called.
               */
              void
              pop()
              {
            __glibcxx_requires_nonempty();
            std::pop_heap(c.begin(), c.end(), comp);
            c.pop_back();
              }
            

            #if __cplusplus >= 201103L void swap(priority_queue& __pq) noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp))) { using std::swap; swap(c, __pq.c); swap(comp, __pq.comp); } #endif };

            // No equality/comparison operators are provided for priority_queue.

            #if __cplusplus >= 201103L template<typename _Tp, typename _Sequence, typename _Compare> inline void swap(priority_queue<_Tp, _Sequence, _Compare>& __x, priority_queue<_Tp, _Sequence, _Compare>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

            template<typename _Tp, typename _Sequence, typename _Compare, typename _Alloc> struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc> : public uses_allocator<_Sequence, _Alloc>::type { }; #endif

            _GLIBCXX_END_NAMESPACE_VERSION } // namespace

            #endif /* _STL_QUEUE_H / // Queue implementation -- C++ -*-

            // Copyright (C) 2001-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.

            // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details.

            // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation.

            // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // http://www.gnu.org/licenses/.

            /* *

            • Copyright (c) 1994
            • Hewlett-Packard Company
            • Permission to use, copy, modify, distribute and sell this software
            • and its documentation for any purpose is hereby granted without fee,
            • provided that the above copyright notice appear in all copies and
            • that both that copyright notice and this permission notice appear
            • in supporting documentation. Hewlett-Packard Company makes no
            • representations about the suitability of this software for any
            • purpose. It is provided "as is" without express or implied warranty.
            • Copyright (c) 1996,1997
            • Silicon Graphics Computer Systems, Inc.
            • Permission to use, copy, modify, distribute and sell this software
            • and its documentation for any purpose is hereby granted without fee,
            • provided that the above copyright notice appear in all copies and
            • that both that copyright notice and this permission notice appear
            • in supporting documentation. Silicon Graphics makes no
            • representations about the suitability of this software for any
            • purpose. It is provided "as is" without express or implied warranty. */

            /** @file bits/stl_queue.h

            • This is an internal header file, included by other library headers.
            • Do not attempt to use it directly. @headername{queue} */

            #ifndef _STL_QUEUE_H #define _STL_QUEUE_H 1

            #include <bits/concept_check.h> #include <debug/debug.h>

            namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION

            /**

            • @brief A standard container giving FIFO behavior.

            • @ingroup sequences

            • @tparam _Tp Type of element.

            • @tparam _Sequence Type of underlying sequence, defaults to deque<_Tp>.

            • Meets many of the requirements of a

            • container,

            • but does not define anything to do with iterators. Very few of the

            • other standard container interfaces are defined.

            • This is not a true container, but an @e adaptor. It holds another

            • container, and provides a wrapper interface to that container. The

            • wrapper is what enforces strict first-in-first-out %queue behavior.

            • The second template parameter defines the type of the underlying

            • sequence/container. It defaults to std::deque, but it can be any type

            • that supports @c front, @c back, @c push_back, and @c pop_front,

            • such as std::list or an appropriate user-defined type.

            • Members not found in @a normal containers are @c container_type,

            • which is a typedef for the second Sequence parameter, and @c push and

            • @c pop, which are standard %queue/FIFO operations. */ template<typename _Tp, typename _Sequence = deque<_Tp> > class queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _FrontInsertionSequenceConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

              template<typename _Tp1, typename _Seq1> friend bool operator==(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

              template<typename _Tp1, typename _Seq1> friend bool operator<(const queue<_Tp1, _Seq1>&, const queue<_Tp1, _Seq1>&);

            public:
              typedef typename _Sequence::value_type                value_type;
              typedef typename _Sequence::reference                 reference;
              typedef typename _Sequence::const_reference           const_reference;
              typedef typename _Sequence::size_type                 size_type;
              typedef          _Sequence                            container_type;
            
            protected:
              /**
               *  'c' is the underlying container.  Maintainers wondering why
               *  this isn't uglified as per style guidelines should note that
               *  this name is specified in the standard, [23.2.3.1].  (Why?
               *  Presumably for the same reason that it's protected instead
               *  of private: to allow derivation.  But none of the other
               *  containers allow for derivation.  Odd.)
               */
              _Sequence c;
            
            public:
              /**
               *  @brief  Default constructor creates no elements.
               */
            

            #if __cplusplus < 201103L explicit queue(const _Sequence& __c = _Sequence()) : c(__c) { } #else explicit queue(const _Sequence& __c) : c(__c) { }

              explicit
              queue(_Sequence&& __c = _Sequence())
              : c(std::move(__c)) { }
            

            #endif

              /**
               *  Returns true if the %queue is empty.
               */
              bool
              empty() const
              { return c.empty(); }
            
              /**  Returns the number of elements in the %queue.  */
              size_type
              size() const
              { return c.size(); }
            
              /**
               *  Returns a read/write reference to the data at the first
               *  element of the %queue.
               */
              reference
              front()
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  Returns a read-only (constant) reference to the data at the first
               *  element of the %queue.
               */
              const_reference
              front() const
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  Returns a read/write reference to the data at the last
               *  element of the %queue.
               */
              reference
              back()
              {
            __glibcxx_requires_nonempty();
            return c.back();
              }
            
              /**
               *  Returns a read-only (constant) reference to the data at the last
               *  element of the %queue.
               */
              const_reference
              back() const
              {
            __glibcxx_requires_nonempty();
            return c.back();
              }
            
              /**
               *  @brief  Add data to the end of the %queue.
               *  @param  __x  Data to be added.
               *
               *  This is a typical %queue operation.  The function creates an
               *  element at the end of the %queue and assigns the given data
               *  to it.  The time complexity of the operation depends on the
               *  underlying sequence.
               */
              void
              push(const value_type& __x)
              { c.push_back(__x); }
            

            #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); }

              template<typename... _Args>
                void
                emplace(_Args&&... __args)
            { c.emplace_back(std::forward<_Args>(__args)...); }
            

            #endif

              /**
               *  @brief  Removes first element.
               *
               *  This is a typical %queue operation.  It shrinks the %queue by one.
               *  The time complexity of the operation depends on the underlying
               *  sequence.
               *
               *  Note that no data is returned, and if the first element's
               *  data is needed, it should be retrieved before pop() is
               *  called.
               */
              void
              pop()
              {
            __glibcxx_requires_nonempty();
            c.pop_front();
              }
            

            #if __cplusplus >= 201103L void swap(queue& __q) noexcept(noexcept(swap(c, __q.c))) { using std::swap; swap(c, __q.c); } #endif };

            /**

            • @brief Queue equality comparison.
            • @param __x A %queue.
            • @param __y A %queue of the same type as @a __x.
            • @return True iff the size and elements of the queues are equal.
            • This is an equivalence relation. Complexity and semantics depend on the
            • underlying sequence type, but the expected rules are: this relation is
            • linear in the size of the sequences, and queues are considered equivalent
            • if their sequences compare equal. */ template<typename _Tp, typename _Seq> inline bool operator==(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c == __y.c; }

            /**

            • @brief Queue ordering relation.
            • @param __x A %queue.
            • @param __y A %queue of the same type as @a x.
            • @return True iff @a __x is lexicographically less than @a __y.
            • This is an total ordering relation. Complexity and semantics
            • depend on the underlying sequence type, but the expected rules
            • are: this relation is linear in the size of the sequences, the
            • elements must be comparable with @c <, and
            • std::lexicographical_compare() is usually used to make the
            • determination. */ template<typename _Tp, typename _Seq> inline bool operator<(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __x.c < __y.c; }

            /// Based on operator== template<typename _Tp, typename _Seq> inline bool operator!=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x == __y); }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return __y < __x; }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator<=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__y < __x); }

            /// Based on operator< template<typename _Tp, typename _Seq> inline bool operator>=(const queue<_Tp, _Seq>& __x, const queue<_Tp, _Seq>& __y) { return !(__x < __y); }

            #if __cplusplus >= 201103L template<typename _Tp, typename _Seq> inline void swap(queue<_Tp, _Seq>& __x, queue<_Tp, _Seq>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

            template<typename _Tp, typename _Seq, typename _Alloc> struct uses_allocator<queue<_Tp, _Seq>, _Alloc> : public uses_allocator<_Seq, _Alloc>::type { }; #endif

            /**

            • @brief A standard container automatically sorting its contents.
            • @ingroup sequences
            • @tparam _Tp Type of element.
            • @tparam _Sequence Type of underlying sequence, defaults to vector<_Tp>.
            • @tparam _Compare Comparison function object type, defaults to
            •                less<_Sequence::value_type>.
              
            • This is not a true container, but an @e adaptor. It holds
            • another container, and provides a wrapper interface to that
            • container. The wrapper is what enforces priority-based sorting
            • and %queue behavior. Very few of the standard container/sequence
            • interface requirements are met (e.g., iterators).
            • The second template parameter defines the type of the underlying
            • sequence/container. It defaults to std::vector, but it can be
            • any type that supports @c front(), @c push_back, @c pop_back,
            • and random-access iterators, such as std::deque or an
            • appropriate user-defined type.
            • The third template parameter supplies the means of making
            • priority comparisons. It defaults to @c less<value_type> but
            • can be anything defining a strict weak ordering.
            • Members not found in @a normal containers are @c container_type,
            • which is a typedef for the second Sequence parameter, and @c
            • push, @c pop, and @c top, which are standard %queue operations.
            • @note No equality/comparison operators are provided for
            • %priority_queue.
            • @note Sorting of the elements takes place as they are added to,
            • and removed from, the %priority_queue using the
            • %priority_queue's member functions. If you access the elements
            • by other means, and change their data such that the sorting
            • order would be different, the %priority_queue will not re-sort
            • the elements for you. (How could it know to do so?) */ template<typename _Tp, typename _Sequence = vector<_Tp>, typename _Compare = less > class priority_queue { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _SequenceConcept) __glibcxx_class_requires(_Sequence, _RandomAccessContainerConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) __glibcxx_class_requires4(_Compare, bool, _Tp, _Tp, _BinaryFunctionConcept)
            public:
              typedef typename _Sequence::value_type                value_type;
              typedef typename _Sequence::reference                 reference;
              typedef typename _Sequence::const_reference           const_reference;
              typedef typename _Sequence::size_type                 size_type;
              typedef          _Sequence                            container_type;
            
            protected:
              //  See queue::c for notes on these names.
              _Sequence  c;
              _Compare   comp;
            
            public:
              /**
               *  @brief  Default constructor creates no elements.
               */
            

            #if __cplusplus < 201103L explicit priority_queue(const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); } #else explicit priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { std::make_heap(c.begin(), c.end(), comp); }

              explicit
              priority_queue(const _Compare& __x = _Compare(),
            	     _Sequence&& __s = _Sequence())
              : c(std::move(__s)), comp(__x)
              { std::make_heap(c.begin(), c.end(), comp); }
            

            #endif

              /**
               *  @brief  Builds a %queue from a range.
               *  @param  __first  An input iterator.
               *  @param  __last  An input iterator.
               *  @param  __x  A comparison functor describing a strict weak ordering.
               *  @param  __s  An initial sequence with which to start.
               *
               *  Begins by copying @a __s, inserting a copy of the elements
               *  from @a [first,last) into the copy of @a __s, then ordering
               *  the copy according to @a __x.
               *
               *  For more information on function objects, see the
               *  documentation on @link functors functor base
               *  classes@endlink.
               */
            

            #if __cplusplus < 201103L template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x = _Compare(), const _Sequence& __s = _Sequence()) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); } #else template priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { __glibcxx_requires_valid_range(__first, __last); c.insert(c.end(), __first, __last); std::make_heap(c.begin(), c.end(), comp); }

              template<typename _InputIterator>
                priority_queue(_InputIterator __first, _InputIterator __last,
            	       const _Compare& __x = _Compare(),
            	       _Sequence&& __s = _Sequence())
            : c(std::move(__s)), comp(__x)
                {
              __glibcxx_requires_valid_range(__first, __last);
              c.insert(c.end(), __first, __last);
              std::make_heap(c.begin(), c.end(), comp);
            }
            

            #endif

              /**
               *  Returns true if the %queue is empty.
               */
              bool
              empty() const
              { return c.empty(); }
            
              /**  Returns the number of elements in the %queue.  */
              size_type
              size() const
              { return c.size(); }
            
              /**
               *  Returns a read-only (constant) reference to the data at the first
               *  element of the %queue.
               */
              const_reference
              top() const
              {
            __glibcxx_requires_nonempty();
            return c.front();
              }
            
              /**
               *  @brief  Add data to the %queue.
               *  @param  __x  Data to be added.
               *
               *  This is a typical %queue operation.
               *  The time complexity of the operation depends on the underlying
               *  sequence.
               */
              void
              push(const value_type& __x)
              {
            c.push_back(__x);
            std::push_heap(c.begin(), c.end(), comp);
              }
            

            #if __cplusplus >= 201103L void push(value_type&& __x) { c.push_back(std::move(__x)); std::push_heap(c.begin(), c.end(), comp); }

              template<typename... _Args>
                void
                emplace(_Args&&... __args)
            {
              c.emplace_back(std::forward<_Args>(__args)...);
              std::push_heap(c.begin(), c.end(), comp);
            }
            

            #endif

              /**
               *  @brief  Removes first element.
               *
               *  This is a typical %queue operation.  It shrinks the %queue
               *  by one.  The time complexity of the operation depends on the
               *  underlying sequence.
               *
               *  Note that no data is returned, and if the first element's
               *  data is needed, it should be retrieved before pop() is
               *  called.
               */
              void
              pop()
              {
            __glibcxx_requires_nonempty();
            std::pop_heap(c.begin(), c.end(), comp);
            c.pop_back();
              }
            

            #if __cplusplus >= 201103L void swap(priority_queue& __pq) noexcept(noexcept(swap(c, __pq.c)) && noexcept(swap(comp, __pq.comp))) { using std::swap; swap(c, __pq.c); swap(comp, __pq.comp); } #endif };

            // No equality/comparison operators are provided for priority_queue.

            #if __cplusplus >= 201103L template<typename _Tp, typename _Sequence, typename _Compare> inline void swap(priority_queue<_Tp, _Sequence, _Compare>& __x, priority_queue<_Tp, _Sequence, _Compare>& __y) noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); }

            template<typename _Tp, typename _Sequence, typename _Compare, typename _Alloc> struct uses_allocator<priority_queue<_Tp, _Sequence, _Compare>, _Alloc> : public uses_allocator<_Sequence, _Alloc>::type { }; #endif

            _GLIBCXX_END_NAMESPACE_VERSION } // namespace

            #endif /* _STL_QUEUE_H */

            • 1

            Information

            ID
            1605
            Time
            1000ms
            Memory
            256MiB
            Difficulty
            7
            Tags
            (None)
            # Submissions
            95
            Accepted
            20
            Uploaded By