構造体ノード{ int型のL、R。 変更可能なint型のV; ノード(int型 L、INT R、int型V):L(L)、R(R)、V(V){} インラインブール 演算子 <(constのノード&B)のconst { 戻り L < BL。 } }。 セット <ノード> S。 typedefの設定 <ノードは> :: ITイテレータ。 int型ANS; ITは、(分割インラインint型POS)を{ ITが s.lower_bound(ノード(POS、POS = 0 ))。 IF(!ITはs.end()&& IT-> L POSは== =)を返す;それを - 、それを INT L = IT-> L、R&LT IT- => R&LT = V IT-> V。 S. ERASE(IT); s.insert(ノード(L、POS - 。1 、V)); リターン。s.insert(ノード(POSは、R、V))まず; } インライン無効に割り当てる(int型 Lを、INT R&LT、INT V){ /// ノートは最初の分割は、右から分割し始めなければならない /// Rを見つけられない原因は、分割を開始するために放置した場合、同じLとRの時間、R範囲+ 1がオフに分割するためREで得 /// が、右への最初の分割は、IT2がIT1離脱しないであろう ITはIT2 =スプリット(R + 1)、IT1 = スプリット(L)を、 IT IT =IT1; 用(;それ= IT2;!++ IT){ ANS - = IT-> V *(IT-> R - IT-> L + 1 )。 } s.erase(IT1、IT2)。 ANS + =(R-L + 1)* V。 s.insert(ノード(L、R、V))。 }