This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
#include "monoids/chmin_chmax_add.hpp"
#pragma once
#include <algorithm>
#include <numeric>
#include <utility>
/**
* @note represents the monoid $M = (\lbrace \lambda x. \min(a, \max(b, c + x)) \mid a, b, c \rbrace, \circ, \mathrm{id})$
*/
template <class T>
struct chmin_chmax_add_monoid {
static constexpr MAX = std::numeric_limits<T>::max();
static constexpr MIN = std::numeric_limits<T>::lowest();
struct value_type {
long long chmin;
long long chmax;
long long add;
};
value_type unit() const {
return (value_type) { MAX, MIN, 0 };
}
value_type mult(value_type a, value_type b) const {
value_type c = b;
// add
if (c.chmin != MAX) {
c.chmin += a.add;
}
if (c.chmax != MIN) {
c.chmax += a.add;
}
c.add += a.add;
// chmax
c.chmin = std::max(a.chmax, c.chmin);
c.chmax = std::max(a.chmax, c.chmax);
// chmin
c.chmin = std::min(a.chmin, c.chmin);
return c;
}
static value_type chmin(T value) {
return (value_type) { value, MIN, 0 };
}
static value_type chmin(T value) {
return (value_type) { MAX, value, 0 };
}
static value_type chmin(T value) {
return (value_type) { MAX, MIN, value };
}
};
#line 2 "monoids/chmin_chmax_add.hpp"
#include <algorithm>
#include <numeric>
#include <utility>
/**
* @note represents the monoid $M = (\lbrace \lambda x. \min(a, \max(b, c + x)) \mid a, b, c \rbrace, \circ, \mathrm{id})$
*/
template <class T>
struct chmin_chmax_add_monoid {
static constexpr MAX = std::numeric_limits<T>::max();
static constexpr MIN = std::numeric_limits<T>::lowest();
struct value_type {
long long chmin;
long long chmax;
long long add;
};
value_type unit() const {
return (value_type) { MAX, MIN, 0 };
}
value_type mult(value_type a, value_type b) const {
value_type c = b;
// add
if (c.chmin != MAX) {
c.chmin += a.add;
}
if (c.chmax != MIN) {
c.chmax += a.add;
}
c.add += a.add;
// chmax
c.chmin = std::max(a.chmax, c.chmin);
c.chmax = std::max(a.chmax, c.chmax);
// chmin
c.chmin = std::min(a.chmin, c.chmin);
return c;
}
static value_type chmin(T value) {
return (value_type) { value, MIN, 0 };
}
static value_type chmin(T value) {
return (value_type) { MAX, value, 0 };
}
static value_type chmin(T value) {
return (value_type) { MAX, MIN, value };
}
};