1#include"../../kyopro_library/template.hpp"
9 using Type=
typename Abel::Type;
16 dat.assign(rn,Abel::id());
17 dat2.assign(n,Abel::id());
18 dat2_inv.assign(n,Abel::id());
26 dat.assign(rn,Abel::id());
28 for(
int i=0; i<rn; i++) {
29 for(
int j=i*rn; j<min((i+1)*rn,n); j++) {
30 dat[i]=Abel::op(dat[i],dat2[j]);
31 dat2_inv[j]=Abel::inv(dat2[j]);
37 SqrtTree(
const vector<Type>& v,
const vector<Type>& v_inv) {
41 dat.assign(rn,Abel::id());
44 for(
int i=0; i<rn; i++) {
45 for(
int j=i*rn; j<min((i+1)*rn,n); j++) {
46 dat[i]=Abel::op(dat[i],dat2[j]);
53 void set(
int i, Type x) {
55 dat[j]=Abel::op(dat[j],Abel::inv(dat2[i]));
57 dat[j]=Abel::op(dat[j],dat2[i]);
58 dat2_inv[i]=Abel::inv(dat2[i]);
62 void set(
int i, Type x, Type x_inv) {
64 dat[j]=Abel::op(dat[j],dat2_inv[i]);
67 dat[j]=Abel::op(dat[j],dat2[i]);
75 if(l%rn==0 && l+rn<=r) {
76 ret=Abel::op(ret,dat[l/rn]);
79 ret=Abel::op(ret,dat2[l]);
86 Type
operator[](
int i)
const {
return dat2[i]; }
87 int size()
const {
return n; }
91 vector<Type> dat,dat2,dat2_inv;
更新 O(1) クエリ O(sqrt(N)) の改造版セグ木
Type fold(int l, int r)
区間 [l, r) の群積を返す
SqrtTree(const vector< Type > &v, const vector< Type > &v_inv)
配列 v とその逆元 v_inv で初期化する
void set(int i, Type x)
i 番目の要素を x に更新する
Type operator[](int i) const
void set(int i, Type x, Type x_inv)
i 番目の要素を x に更新し、その逆元を x_inv に更新する
SqrtTree(const vector< Type > &v)
配列 v で初期化する