17 void set(ll i, Type v) {
18 ll left=0,right=mx,cur=0;
21 ll mid=(left+right)/2;
24 if(i<mid) nxt=node[cur].to[0],toi=0;
25 else nxt=node[cur].to[1],toi=1;
29 node[cur].to[toi]=nxt;
31 if(toi==0) node.push_back(Node(left,mid));
32 else node.push_back(Node(mid,right));
45 int leftc=node[r].to[0],rightc=node[r].to[1];
46 Type leftv=(leftc==-1 ? Monoid::id() : node[leftc].value);
47 Type rightv=(rightc==-1 ? Monoid::id() : node[rightc].value);
48 node[r].value=Monoid::op(leftv,rightv);
53 Type
fold(ll l, ll r,
int idx, ll left, ll right) {
54 if(right<l||left>r)
return Monoid::id();
55 if(l<=left&&right<=r)
return node[idx].value;
57 ll mid=(left+right)/2;
58 int leftc=node[idx].to[0],rightc=node[idx].to[1];
61 if(leftc==-1) leftv=Monoid::id();
62 else leftv=fold(l,r,leftc,left,mid);
63 if(rightc==-1) rightv=Monoid::id();
64 else rightv=fold(l,r,rightc,mid,right);
66 return Monoid::op(leftv,rightv);