21 dat.assign(n<<1,Monoid::id());
22 for(
int i=0; i<n; i++) dat[i+n]=v[i];
23 for(
int i=n-1; i>0; i--) dat[i]=Monoid::op(dat[i<<1],dat[i<<1|1]);
24 cand.reserve(100),cand_l.reserve(100),cand_r.reserve(100);
53 assert(f(Monoid::id()));
57 cand_l.clear(),cand_r.clear();
59 if(l&1) cand_l.push_back(l++);
60 if(r&1) cand_r.push_back(--r);
64 reverse(cand_r.begin(),cand_r.end());
65 cand.insert(cand.end(),cand_r.begin(),cand_r.end());
66 Type val=Monoid::id();
68 if(f(Monoid::op(val,dat[i]))) {
69 val=Monoid::op(val,dat[i]);
73 if(f(Monoid::op(val,dat[i]))) {
74 val=Monoid::op(val,dat[i]);
89 assert(f(Monoid::id()));
93 cand_l.clear(),cand_r.clear();
95 if(l&1) cand_l.push_back(l++);
96 if(r&1) cand_r.push_back(--r);
100 reverse(cand_l.begin(),cand_l.end());
101 cand.insert(cand.end(),cand_l.begin(),cand_l.end());
102 Type val=Monoid::id();
104 if(f(Monoid::op(dat[i],val))) {
105 val=Monoid::op(dat[i],val);
109 if(f(Monoid::op(dat[i],val))) {
110 val=Monoid::op(dat[i],val);