1#include"../../kyopro_library/template.hpp"
4 template<
typename Node>
7 template<
typename...Args>
8 inline Ptr
my_new(Args...args) {
return new Node(args...); }
9 inline void my_del(Ptr t) {
delete t; }
13 if(!l||!r)
return l?l:r;
14 if(
int((rng()*(l->cnt+r->cnt))>>32)<l->cnt) {
25 if(!t)
return {
nullptr,
nullptr};
32 auto s=split(t->r,k-count(t->l)-1);
37 Ptr
build(
int l,
int r,
const vector<
decltype(Node::key)>& v) {
38 if(l+1==r)
return my_new(v[l]);
41 if(l<m) pm->l=build(l,m,v);
42 if(m+1<r) pm->r=build(m+1,r,v);
45 Ptr
build(
const vector<
decltype(Node::key)>& v) {
46 return build(0,(
int)v.size(),v);
48 template<
typename...Args>
49 void insert(Ptr& t,
int k,
const Args& ...args) {
55 auto y=split(x.second,1);
62 static uint64_t x_=88172645463325252ULL;
63 return x_^=x_<<7,x_^=x_>>9,x_&0xFFFFFFFFull;
65 inline int count(
const Ptr t)
const {
return t?t->cnt:0; }
70 template<
typename T,
typename E>
80 template<
typename T,
typename E, T(*f)(T,T), T(*g)(T,E), E(*h)(E,E), T(*ts)(T)>
86 using typename base::Ptr;
94 T
fold(Ptr&t,
int a,
int b) {
96 auto y=split(x.second,b-a);
97 auto ret=
sum(y.first
);
98 t=merge(x.first,merge(y.first,y.second));
103 auto y=split(x.second,b-a);
105 t=merge(x.first,merge(y.first,y.second));
107 void apply(Ptr&t,
int a,
int b,
const E&e) {
109 auto y=split(x.second,b-a);
111 t=merge(x.first,merge(y.first,y.second));
115 inline T
sum(
const Ptr t)
const {
return t?t->sum:T();}
120 if(t->l)t->cnt+=t->l->cnt,t->sum=f(t->l->sum,t->sum);
121 if(t->r)t->cnt+=t->r->cnt,t->sum=f(t->sum,t->r->sum);
137 t->lazy=h(t->lazy,x);
143 T
op(T a, T b) {
return a+b; }
145 T
e(T a) {
return a; }
154 using node_ptr=node*;
174 root=rbst.build(init);
179 root=rbst.build(init);
185 assert(0<=k&&k<=
_size);
187 rbst.insert(root,k,x);
192 assert(0<=k&&k<
_size);
199 assert(0<=k&&k<
_size);
200 return rbst.fold(root,k,k+1);
205 assert(0<=k&&k<
_size);
212 assert(0<=l&&l<=r&&r<=
_size);
213 rbst.reverse(root,l,r);
InsertableReversibleArray(const vector< T > &init)
void set(int k, T x)
i 番目の要素を x に変更する
InsertableReversibleArray(int n)
InsertableReversibleArrayImpl::LazyReversibleRBST< T, T, InsertableReversibleArrayImpl::op< T >, InsertableReversibleArrayImpl::op< T >, InsertableReversibleArrayImpl::op< T >, InsertableReversibleArrayImpl::e< T > > rbst
void erase(int k)
i 番目を削除する
InsertableReversibleArray()=default
void insert(int k, T x)
i 番目に x を挿入する
void reverse(int l, int r)
区間 [l, r) の要素を反転する
Ptr update(Ptr t) override
void reverse(Ptr &t, int a, int b)
LazyReversibleRBST()=default
void apply(Ptr &t, int a, int b, const E &e)
void push(Ptr t) override
T fold(Ptr &t, int a, int b)
void propagate(Ptr t, const E &x)
LazyReversibleRBSTNode(const T &t=T(), const E &e=E())
RBSTBase< LazyReversibleRBSTNode >::Ptr l
RBSTBase< LazyReversibleRBSTNode >::Ptr r
pair< Ptr, Ptr > split(Ptr t, int k)
void insert(Ptr &t, int k, const Args &...args)
void erase(Ptr &t, int k)
int count(const Ptr t) const
Ptr build(const vector< decltype(Node::key)> &v)
Ptr build(int l, int r, const vector< decltype(Node::key)> &v)
virtual Ptr update(Ptr)=0