kyopro-lib

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:warning: Min-Max monoid
(Mylib/AlgebraicStructure/Monoid/min_max.cpp)

Operations

Requirements

Notes

Problems

References

Code

#pragma once
#include <algorithm>
#include <optional>

namespace haar_lib {
  namespace min_max_monoid_impl {
    template <typename T>
    struct internal_value {
      std::optional<T> min, max;
      internal_value() : min(std::nullopt), max(std::nullopt) {}
      internal_value(T value) : min(value), max(value) {}
    };
  }  // namespace min_max_monoid_impl

  template <typename T>
  struct min_max_monoid {
    using value_type = min_max_monoid_impl::internal_value<T>;

    value_type operator()() const {
      return {};
    }

    value_type operator()(const value_type &a, const value_type &b) const {
      value_type ret;
      if (not a.min) ret.min = b.min;
      if (not b.min) ret.min = a.min;
      if (a.min and b.min) ret.min = std::min(a.min.value(), b.min.value());

      if (not a.max) ret.max = b.max;
      if (not b.max) ret.max = a.max;
      if (a.max and b.max) ret.max = std::max(a.max.value(), b.max.value());

      return ret;
    }
  };
}  // namespace haar_lib
#line 2 "Mylib/AlgebraicStructure/Monoid/min_max.cpp"
#include <algorithm>
#include <optional>

namespace haar_lib {
  namespace min_max_monoid_impl {
    template <typename T>
    struct internal_value {
      std::optional<T> min, max;
      internal_value() : min(std::nullopt), max(std::nullopt) {}
      internal_value(T value) : min(value), max(value) {}
    };
  }  // namespace min_max_monoid_impl

  template <typename T>
  struct min_max_monoid {
    using value_type = min_max_monoid_impl::internal_value<T>;

    value_type operator()() const {
      return {};
    }

    value_type operator()(const value_type &a, const value_type &b) const {
      value_type ret;
      if (not a.min) ret.min = b.min;
      if (not b.min) ret.min = a.min;
      if (a.min and b.min) ret.min = std::min(a.min.value(), b.min.value());

      if (not a.max) ret.max = b.max;
      if (not b.max) ret.max = a.max;
      if (a.max and b.max) ret.max = std::max(a.max.value(), b.max.value());

      return ret;
    }
  };
}  // namespace haar_lib
Back to top page