コピペ用 ACLib仕様の基本的な遅延セグメント木

使い方などは AC-Libraryのドキュメント を参照

コンテスト中、AOJ Coursesにあるようなやつはコピペして使いたいのでまとめ

infはint64で表せる十分大きい整数で、足してもオーバーフローしないくらいの大きさを想定。普段は$4\times10^{18}$を使っている

Range Affine Range Sum

https://atcoder.jp/contests/practice2/tasks/practice2_k

*a+bの更新、区間Sum。適宜llをmintとかに変更

1倍してb足すのをRAQ、0倍してa足すのをRUQとして使える

struct S {
    ll a;
    int size;
};

struct F {
    ll a, b;
};

S op(S l, S r) { return {l.a + r.a, l.size + r.size}; }

S e() { return {0, 0}; }

S mapping(F l, S r) { return {r.a * l.a + r.size * l.b, r.size}; }

F composition(F l, F r) { return {r.a * l.a, r.b * l.a + l.b}; }

F id() { return F{1, 0}; }

Range Update Query (RUQ)

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_D&lang=ja

using S = ll;
struct F {
    bool id;  // updateに単位元を作るためのフラグ
    ll x;
};

S op(S l, S r) { return min(l, r); }

S e() { return inf; }

S mapping(F f, S s) { return f.id ? s : f.x; }

F composition(F f, F g) { return {f.id && g.id, f.id ? g.x : f.x}; }

F id() { return {true, 0ll}; }

RMQ and RUQ

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_F&lang=ja

Min Query

using S = ll;
struct F {
    bool id;
    ll x;
};

S op(S l, S r) { return min(l, r); }

S e() { return inf; }

S mapping(F f, S s) { return f.id ? s : f.x; }

F composition(F f, F g) { return {f.id && g.id, f.id ? g.x : f.x}; }

F id() { return {true, 0ll}; }

RSQ and RAQ

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_G&lang=ja

struct S {
    ll sum, size;
};
using F = ll;

S op(S l, S r) { return S{l.sum + r.sum, l.size + r.size}; }

S e() { return {0, 0}; }

S mapping(F f, S s) { return S{s.sum + s.size * f, s.size}; }

F composition(F f, F g) { return f + g; }

F id() { return 0; }

RMQ and RAQ

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_H&lang=ja

Min Query

using S = ll;
using F = ll;

S op(S l, S r) { return min(l, r); }

S e() { return inf; }

S mapping(F f, S s) { return s == inf ? inf : s + f; }

F composition(F f, F g) { return f + g; }

F id() { return 0; }

RSQ and RUQ

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_I&lang=ja

struct S {
    ll sum, size;
};
struct F {
    bool id;
    ll x;
};

S op(S l, S r) { return S{l.sum + r.sum, l.size + r.size}; }

S e() { return S{0, 0}; }

S mapping(F f, S s) { return f.id ? s : S{f.x * s.size, s.size}; }

F composition(F f, F g) { return f.id ? g : f; }

F id() { return {true, 0ll}; }